创建NSDate时区问题

时间:2011-11-02 11:09:35

标签: api timezone nsdate locale gmt

我正在从我的网络服务加载日期,我发送日期格式(格林威治标准时间):02/11/11 10:56:09

我正在使用NSDateFormatter创建一个NSDate表单:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
NSDate *journeyDate = [dateFormatter dateFromString:str];
[dateFormatter release];

在我将其与当前日期进行比较以获得相对时间间隔之后,这很有用。

问题是当手机设置在不同的时区时,当我从我的api加载日期,并使用日期格式化程序时,似乎正在发生的事情是手机假设日期字符串是本地时间和它正在将其转换为GMT。

示例:

我加载了一个日期,时间是从api开始的10点。 手机设置为PDT。 日期格式化程序正在创建一个NSDate,假设我的日期字符串为10am,实际上与手机相关。

我的日期和时间等于下午5点,加上10个小时。

我想在我的日期格式化程序中指定该字符串是GMT,但我遇到了麻烦,我尝试了以下内容,将GMT添加到格式中:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss GMT"];
NSDate *journeyDate = [dateFormatter dateFromString:str];
[dateFormatter release];

这不起作用。

有人可以提出任何建议吗?

解决方案

回顾一下,我通过将GMT附加到原始字符串并将格式化为:

来解决这个问题。
NSString * cheat = [NSString stringWithFormat:@"%@ GMT", str];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss zzzz"];
NSDate *journeyDate = [dateFormatter dateFromString:cheat];
[dateFormatter release];
return journeyDate;

这是一种不稳定的黑客攻击,因为如果将字符串更改为包含时区,则它将不再起作用。对于任何需要自己做的人来说,以下只是一个关于如何创建NSTimeZone的简单示例。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *journeyDate = [dateFormatter dateFromString:str];
[dateFormatter release];
return journeyDate;

感谢您的快速帮助。

2 个答案:

答案 0 :(得分:1)

我怀疑您只想使用NSDateFormatter.setTimeZone强制它使用UTC。您不想更改格式字符串,因为可能是字符串不包含字母“GMT” - 相反,您想要更改字符串被解释的时区,这就是{ {1}}会这样做。

答案 1 :(得分:1)