【问题标题】:NSDateformatter wrong time zoneNSDateformatter 时区错误
【发布时间】:2016-08-10 17:48:39
【问题描述】:

我从服务器获取以下日期为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(当然时区相同)。我希望转换后的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

【问题讨论】:

    标签: ios9 nsdate nsdateformatter


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 1970-01-01
      • 2012-09-28
      • 2013-09-16
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多