0

我正在从我的网络服务中加载日期,我正在以格式(格林威治标准时间)发送日期: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 加载日期并使用日期格式化程序时,似乎正在发生的事情是手机假设日期字符串是本地时间并且它正在转换它到格林威治标准时间。

例子:

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

我最终得到一个等于下午 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;

感谢您的快速帮助。

4

2 回答 2

1

我怀疑你只是想使用NSDateFormatter.setTimeZone来强制它使用UTC。您不想更改格式字符串,因为大概该字符串不包含字母“GMT” - 相反,您想更改解释字符串的时区,这就是setTimeZone将要执行的操作。

于 2011-11-02T11:15:15.403 回答
1

您应该使用 setTimeZone 方法:http: //developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

于 2011-11-02T11:15:21.113 回答