格式化日期字符串后丢失1小时

时间:2013-10-08 08:56:58

标签: ios nsdateformatter

我正在使用以下代码格式化日期字符串:

这是日期字符串的格式: 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 个答案:

答案 0 :(得分:1)

您的两个日期格式化程序HHMM_FromatterdateFormatter使用不同的区域设置,因此使用不同的时区。您应该将两个格式化程序的时区明确设置为同一区域(可能是[NSTimeZone localTimeZone])。

请注意,日期代码的其余部分似乎很脆弱。您不应该进行字符串计算以从字符串表示中删除时区。

NSDate表示绝对时间点,不受时区或区域设置的影响。您应该将字符串解析为单个NSDate,然后使用此日期来计算考虑时区的面向用户的字符串表示。