创建 NSDate 时区问题
Posted
技术标签:
【中文标题】创建 NSDate 时区问题【英文标题】:Create NSDate timezone issue 【发布时间】:2011-12-20 05:31:28 【问题描述】:我正在从我的网络服务加载日期,我正在发送格式为(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,假设我上午 10 点的日期字符串实际上与手机相关。
我最终得到的日期和时间等于下午 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;
这是一种不稳定的 hack,因为如果字符串更改为包含时区,它将不再起作用。对于任何需要像我一样做的人,以下只是一个关于如何创建 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;
感谢您的快速帮助。
【问题讨论】:
【参考方案1】:我怀疑你只是想使用 NSDateFormatter.setTimeZone 来强制它使用 UTC。您不想更改 format 字符串,因为该字符串可能不包含字母“GMT” - 相反,您想更改解释字符串的时区,即@ 987654322@ 可以。
【讨论】:
【参考方案2】:您应该使用 setTimeZone 方法:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html
【讨论】:
哎呀,没有看到其他答案...我的是重复的以上是关于创建 NSDate 时区问题的主要内容,如果未能解决你的问题,请参考以下文章
NSDate: 我只输入utc时间成分,并正确设置日历,但NSDate不知为何会被重新计算到我的时区。