创建具有特定时区的 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 对象的主要内容,如果未能解决你的问题,请参考以下文章