0

私のアプリでは、以下の手順に従って最終的な文字列を取得したいと考えています。私のメッセージ形式は以下のとおりです

message <br/><br/> On {date_time_stamp} sender_name wrote <br/><br/>

私のメッセージ文字列が以下のようになっているとしましょう

 Hello developers <br/><br/> On {2013-02-28 05:00:33} Bob wrote <br/><br/>
 Hello World <br/><br/> On {2013-02-27 08:35:33} Jack wrote <br/><br/>
 Hello Apple <br/><br/> On {2013-02-26 04:10:44} Tom wrote <br/><br/>

今、私は以下の手順に従う必要があります

  1. メッセージ内のすべての日付を 1 つずつ取得する

  2. GMT タイム ゾーンからローカル タイム ゾーンに変換する

  3. メッセージの GMT 日付を現地の日時に置き換えます

  4. 最後に、「breakline with \n」を置き換え、中かっこをメッセージから削除します。

私は以下のコードを持っています

 -(void)parseMessageBody:(NSString*)msg
{
    NSRange openBracket = [msg rangeOfString:@"{"];
    NSRange closeBracket = [msg rangeOfString:@"}"];
    NSRange numberRange = NSMakeRange(openBracket.location + 1, closeBracket.location - openBracket.location - 1);
    NSString *numberString = [msg substringWithRange:numberRange];
    NSLog(@"Parsed string: %@",numberString);
}

-(NSString*)formattedMessageFromString:(NSString*)msg
{
    NSString *formattedMessage = @"";
    formattedMessage = [msg stringByReplacingOccurrencesOfString:@"<br/>" withString:@"\n"];
    return formattedMessage;
}

-(NSString*)getLocalDateFromUTCDateString:(NSString*)utcDateString
{
    NSDateFormatter *serverDateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *sourceTimeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [serverDateFormatter setTimeZone:sourceTimeZone];
    [serverDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *dateFromServer = [serverDateFormatter dateFromString:utcDateString];
    DLog(@"UTC date From SERVER: %@",dateFromServer);

    NSDateFormatter *localDateFormatter = [[NSDateFormatter alloc] init];
    [localDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSTimeZone* localTimeZone = [NSTimeZone systemTimeZone];
    [localDateFormatter setTimeZone:localTimeZone];
    NSString *localDate = [localDateFormatter stringFromDate:dateFromServer];
    DLog(@"Converted Local DAte : %@",localDate);

    return localDate;
}

手順 1 と 3 を実行して、メッセージ内のすべての日付を取得し、それを現地の日時に置き換えることができません。また、メッセージは時間の経過とともに大きくなる可能性があります。したがって、解析は高速である必要があります。メッセージ内のすべての日付を取得して、変換された日付に置き換える方法を教えてもらえますか?

どんな種類の助けも大歓迎です。前もって感謝します。

4

1 に答える 1

2

日付の検索と置換は正規表現で行うことができます:

NSString *msg = @"Hello developers <br/><br/> On {2013-02-28 05:00:33} Bob wrote <br/><br/>\n"
   "Hello World <br/><br/> On {2013-02-27 08:35:33} Jack wrote <br/><br/>\n"
   "Hello Apple <br/><br/> On {2013-02-26 04:10:44} Tom wrote <br/><br/>\n";
NSMutableString *replacedMsg = [msg mutableCopy];

NSString *pattern = @"\\{(.+?)\\}"; // Pattern for { ... }
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];

__block int offset = 0;
[regex enumerateMatchesInString:msg options:0 range:NSMakeRange(0, [msg length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    NSRange range0 = [result range]; // range including { }
    NSRange range1 = [result rangeAtIndex:1]; // range excluding { }
    range0.location += offset;
    range1.location += offset;
    NSString *oldDate = [replacedMsg substringWithRange:range1];
    NSString *newDate = [self getLocalDateFromUTCDateString:oldDate];
    if (newDate != nil ) {
        [replacedMsg replaceCharactersInRange:range0 withString:newDate];
        offset += [newDate length] - range0.length;
    }
}];

NSLog(@"%@", replacedMsg);

出力 (私のローカル タイムゾーンは GMT+01 です):

Hello developers <br/><br/> On 2013-02-28 06:00:33 Bob wrote <br/><br/>
Hello World <br/><br/> On 2013-02-27 09:35:33 Jack wrote <br/><br/>
Hello Apple <br/><br/> On 2013-02-26 05:10:44 Tom wrote <br/><br/>
于 2013-04-20T10:46:51.973 に答える