使用initWithTimeInterval获取错误的日期:sinceDate:

时间:2010-08-23 17:58:08

标签: objective-c cocoa nsdate nstimezone

我有一个日期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 个答案:

答案 0 :(得分:2)

日期对象代表一个特定的时刻,无论当时人们的时钟可能有什么不同。

当您想要显示日期时,时区会变得复杂,因为您通常会显示当时用户的时钟所说的(或正在说或将要说的)。这正是您在NSLog NSDate时所发生的情况:日期描述是您当地时区所代表的时刻。

添加到NSDate或从NSDate中减去不是时区转换。加法和减法产生代表其他时刻的NSDates;在你的情况下,你从你开始的那一刻起6小时后创建一个NSDate, not 在地球另一边的同一时刻。

为了简化,时区转换在空间中的不同点(行星表面的不同部分)中查看同时,而日期加法和减法< em>计算不同的时间。

NSDate没有时区转换,因为它不在时区中。格式化该时区的日期时,仅涉及时区。因此,要在其他时区显示该日期,请执行此操作。通常,这意味着为date formatter提供所需的时区。

答案 1 :(得分:1)

我发现你回来的日期有不同的时区+200而不是-400。如果您发现您将看到该结果比原始日期晚12小时(或6小时+6小时)。你创造新约会时,你是否偶然改变了语言环境?当您进行的更改开始为您+200而不是-400时,系统会自动调整补偿时间,然后您再添加6个小时的日期。 NSDate将所有日期存储为自格林威治标准时间2001年1月1日起的时间间隔,并根据需要调整时区。