创建具有特定时区的 NSDate 对象

Posted

技术标签:

【中文标题】创建具有特定时区的 NSDate 对象【英文标题】:Creating NSDate object with specific time zone 【发布时间】:2013-12-19 14:27:20 【问题描述】:

我已经写了一个方法,它接受一个 NSDate 对象,并且应该把它变成一个带有 EST 时区的 NSDate 对象。我看到其他人完成此操作的方法是使用日期格式化程序将日期更改为具有指定时区的字符串。问题是当我尝试使用“dateFromString”将该字符串更改回 NSDate 对象时。

- (NSDate*)turnToEST:(NSDate*)date

NSLog(@"turnToEST called with date %@", date);

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];

NSString *stringFromDate = [dateFormatter stringFromDate:date];

NSLog(@"date formatted is %@", stringFromDate);

NSDate *dateFromString = [[NSDate alloc] init];

NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc]init];
[dateFormatter2 setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

dateFromString = [dateFormatter2 dateFromString:stringFromDate];

NSLog(@"date has been changed to %@", dateFromString);

return date;

有输出...

turnToEST called with date 2013-12-19 14:15:17 +0000
date formatted is 2013-12-19 09:15:17
date has been changed to 2013-12-19 14:15:17 +0000

我不知道为什么这有什么不同

Converting NSString to NSDate (and back again)

【问题讨论】:

- (NSDate*)turnToEST:(NSDate*)date return date; :P NSDate 对象不受时区限制,它们是绝对的。 【参考方案1】:

NSDate没有有关联的时区,它们代表一个抽象的时刻。因此,“具有 EST 时区的 NSDate 对象”并不存在。时区只有在格式化输出或尝试进行基于日历的数学运算时才会发挥作用。

NSLog 在打印其输出时始终使用 UTC。

因此,您需要花一点时间,将其格式化为特定时区的字符串,然后将其解析回同一时间。这按预期工作。

【讨论】:

这个答案中有一些不正确的陈述。 1) NSDate 不是抽象的。它是自特定时区中特定 epoc 以来的秒数。 2) 记录 NSDate 始终以 UTC 时间显示日期,而不是本地时间。 所以NSDate的值不能改变?只是输出时的样子? NSDate 值将始终为 GMT 格式。事情就是这样,对此无能为力。因此,每当调用 dateFromString 时,它如何知道字符串正在 EST 中显示?因此,例如,一个字符串由 06:00:00 组成,然后在其上调用 dateFromString。它怎么知道这个 06:00:00 不是格林威治标准时间? 这是因为计算机时钟在美国东部标准时间,所以它知道向上移动 5 小时吗? @rmaddy 您混淆了 NSDate 值如何在内部存储与其所代表的内容。是的,时代确实需要是特定时区的值。但是那个时代是什么,它在哪个时区,就 NSDates 或字符串转换的推理而言并不重要。

以上是关于创建具有特定时区的 NSDate 对象的主要内容,如果未能解决你的问题,请参考以下文章

从没有“时区校正”的组件创建 NSDate

NSDate 比较,找出特定(本地)时区的“午夜数”

NSDate 似乎如何知道它是 TimeZone?

如何使 NSDate 与关联对象一起工作?

如何通过 Graph API 创建一个 Facebook 事件以具有特定时间和时区,该时间和时区不会因个人用户而改变?

CoreData 获取问题:获取具有特定日期数组的实体