0

次のコードで日付文字列をフォーマットしています:

これは日付文字列の形式です: 2013-10-08T20:30:00+03:00

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setDateFormat:@"EEEE"];


NSDateFormatter *formmatter = [[NSDateFormatter alloc] init];
formmatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:SSSZZZ";
NSString *dataString = [meetingData objectForKey:@"start"];
if (![dataString isKindOfClass:[NSNull class]]) {
    NSMutableString *mutableDate = [dataString mutableCopy];
    [mutableDate deleteCharactersInRange:NSMakeRange(mutableDate.length - 3, 1)];
    NSDate *gmtDate = [formmatter dateFromString:mutableDate];
    NSDateFormatter *HHMM_Fromatter = [[NSDateFormatter alloc] init];
    [HHMM_Fromatter setDateFormat:@"HH:mm"];
    self.meetingTime = checkTheObject([HHMM_Fromatter stringFromDate:gmtDate]);
    self.meetingDay = checkTheObject([dateFormatter stringFromDate:gmtDate]);
}

出力はself.meetingTime: 19:30 でself.meetingDay問題ありませんが、なぜ 1 時間を失っているのでしょうか?

4

1 に答える 1

1

2 つの日付フォーマッタが異なるロケールHHMM_FromatterdateFormatter使用しているため、異なるタイム ゾーンが使用されています。両方のフォーマッタのタイムゾーンを明示的に同じゾーンに設定する必要があります (おそらく[NSTimeZone localTimeZone])。

日付コードの残りの部分は壊れやすいように見えることに注意してください。文字列表現からタイムゾーンを削除するために文字列計算を行うべきではありません。

NSDateは絶対的な時点を表し、タイム ゾーンやロケールの影響を受けません。文字列を 1 つの単一に解析し、NSDateこの日付を使用して、タイム ゾーンを考慮したユーザー向けの文字列表現を計算する必要があります。

于 2013-10-08T09:02:41.470 に答える