![](/img/trans.png)
[英]NSDateFormatter stringFromDate: returning local time instead of UTC / GMT
[英]Why does stringFromDate NSString still have GMT time even though I set timezone on the NSDateFormatter?
实际NSDate对象( firstTime )的输出是我想要的输出(iOS设备的时间)。 即使我将日期格式器( df )设置为localTimeZone ,NSString对象( secondTime )仍似乎显示GMT时间(比我的当地时间EST早4小时)。 为什么不起作用?
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];
NSDate *firstTime = [NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];
NSLog(@"%@", firstTime);
NSString *secondTime = [df stringFromDate:firstTime];
NSLog(@"%@", secondTime);
输出:
第一次:2014-05-07 17:41:29 +0000,第二时间:13:41:29
NSDate
没有时区。 读五遍,直到您理解它。
这个:
[NSDate date]
返回现在的日期。 它没有时区。 它不在格林尼治标准时间或任何其他时区。 它没有一个。 您的代码:
[NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];
表示GMT以外的任何用户现在都没有的时间。 我将重复一遍:您的NSDate
现在不再描述。 这就像坐在旧金山,看着您的手表设置在正确的当地时间,然后说12:00,然后告诉所有人“这是凌晨4点,因为我们比格林尼治标准时间晚8个小时”。
结果是:
[df stringFromDate:firstTime]
将构建一个字符串,该字符串将显示不是现在的时间。
不要再想自己比以前在苹果公司工作过的每个人都要聪明,请尝试以下方法:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];
NSString *secondTime = [df stringFromDate:[NSDate date]];
NSLog(@"%@", secondTime);
这样说:“在当地时区给我一串'now'。” 告诉我:它输出正确的东西吗?
应该让NSDate
捕获真实的日期/时间,而不要尝试进行任何时区调整,然后让NSDateFormatter
格式化字符串,以便在所需的时区中表示它。
因此,查看您的代码:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];
很好,尽管不需要将时区设置为本地时区。 日期格式化程序默认为当前时区。
但是随后您尝试获取当前时间并进行调整:
NSDate *firstTime = [NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];
NSLog(@"%@", firstTime);
虽然我了解您为何尝试这样做,但这是不正确的。 请勿调整时区。 因此, firstTime
分配应为:
NSDate *firstTime = [NSDate date];
NSLog(@"%@", firstTime);
因此,如果您在美国东部时间下午5:41进行此操作,则此NSLog
现在将报告2014-05-07 21:41:29 +0000
,但这是正确的(因为+0000
表示它以UTC / GMT /祖鲁语)。
然后,如果要在本地时区显示该日期,则可以采用未调整的[NSDate date]
并将其与格式化程序一起使用,就像在问题中所做的那样:
NSString *secondTime = [df stringFromDate:firstTime];
NSLog(@"%@", secondTime);
然后17:41:29
您的预期报告17:41:29
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.