我有一个日期,2010-08-23 13:30:00 -0400
我正试图在 UTC +2 时区得到它。以秒为单位的差异是 21600 但是当我打电话时[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
,我得到2010-08-24 01:30:00 +0200
了应该是2010-08-23 19:30:00 +0200
的。知道我做错了什么吗?
2 回答
一个日期对象代表一个特定的时刻,而不管当时不同人的时钟可能会说什么。
当您想要显示日期时会涉及时区,因为您通常会显示当时用户的时钟会说(或正在说或将说)的内容。这正是您NSLog
使用 NSDate 时发生的情况:日期的描述是您当地时区中表示的那个时间点。
添加到 NSDate 或从 NSDate 中减去不是时区转换。加法和减法产生代表其他时刻的NSDates ;在您的情况下,您正在从您开始的那一刻起 6 小时后创建一个 NSDate,而不是在地球另一端的同一时刻。
为简化起见,时区转换是在空间的不同点(行星表面的不同部分)中查看同一时间,而日期加法和减法计算的是不同的时间。
NSDate 没有时区转换,因为它开始时不在时区中。仅当您格式化该时区的日期时,才会涉及时区。因此,要在其他时区显示该日期,只需执行此操作即可。通常,这意味着向您的日期格式化程序提供所需的时区。
我看到你回来的日期+200
没有不同的时区-400
。如果您注意到,您将看到该结果比您的原始日期晚了 12 小时(或 6 小时 + 6 小时)。当您确定新日期时,您是否也偶然更改了语言环境?当您进行更改时开始给您+200
而不是-400
系统自动调整时间来补偿,然后您又增加了 6 个小时的日期。NSDate 将所有日期存储为自 2001 年 1 月 1 日 GMT 以来的时间间隔,并根据需要调整时区。