NSDateformatter错误的时区

时间:2016-08-10 17:48:40

标签: ios9 nsdate nsdateformatter

我从服务器获取以下日期为string

"Fri, 09 Sep 2016 16:50:40 GMT"

我希望将其转换为我的本地timezone,我有这种方法可以做到这一点:

-(NSString *)convertDatetoLocalTimeZone:(NSString *)dateString {

    NSDateFormatter *serverFormatter = [[NSDateFormatter alloc] init];
    [serverFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
    [serverFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];

    NSDate *expDate = [serverFormatter dateFromString:dateString];

    NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init];
    [userFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];
    [userFormatter setTimeZone:[NSTimeZone systemTimeZone]];

    return [userFormatter stringFromDate:expDate];

}

现在转换的日期是:

"Fri, 09 Sep 2016 12:50:40 EDT"

由于这是一个字符串,我想将其转换为NSDate(具有相同时区的OfCourse)。我希望转换后的NSDate会显示EDT时区。

以下是将字符串转换回NSDate

的内容
-(NSDate *)getDateFromString:(NSString*)dateString{

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];
    [df setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EDT"]];  //I also tried [NSTimeZone systemTimeZone]
    return [df dateFromString:dateString];

}

返回的日期是:

 2016-09-09 16:50:40 +0000 //this is in UTC

我还尝试将语言环境设置为en_US

我的问题是为什么日期格式化程序会将EDT转换为UTC,即使我将时区设置为EDT

1 个答案:

答案 0 :(得分:0)

  

我希望转换后的NSDate会显示EDT时区。

这是你的问题。 NSDate没有时区。 NSDate的实例代表特定时刻。它并不意味着特定时刻的特定时刻,只是特定时刻。

如果您打印NSDate,则会看到日期的UTC表示形式。这并不意味着日期是UTC,只是在打印时使用了UTC。

因此,您的convertDatetoLocalTimeZone方法已获得有效NSDate。您不需要单独的getDateFromString方法,因为您已经在计算该方法的结果。存储NSDate值并在必要时将它们转换为字符串总是更好,而不是将它们存储为字符串并转换回NSDate。将日期保存在convertDatetoLocalTimeZone中,不要保存字符串,然后再转换回NSDate