繁体   English   中英

即使我在NSDateFormatter上设置了时区,为什么stringFromDate NSString仍然具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM