我从服务器获取以下日期为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
?
答案 0 :(得分:0)
我希望转换后的NSDate会显示EDT时区。
这是你的问题。 NSDate
没有时区。 NSDate
的实例代表特定时刻。它并不意味着特定时刻的特定时刻,只是特定时刻。
如果您打印NSDate
,则会看到日期的UTC表示形式。这并不意味着日期是UTC,只是在打印时使用了UTC。
因此,您的convertDatetoLocalTimeZone
方法已获得有效NSDate
。您不需要单独的getDateFromString
方法,因为您已经在计算该方法的结果。存储NSDate
值并在必要时将它们转换为字符串总是更好,而不是将它们存储为字符串并转换回NSDate
。将日期保存在convertDatetoLocalTimeZone
中,不要保存字符串,然后再转换回NSDate
。