【问题标题】:Getting wrong date with initWithTimeInterval: sinceDate:使用 initWithTimeInterval 获取错误日期:sinceDate:
【发布时间】:2010-08-23 17:58:07
【问题描述】:

我有一个日期,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。知道我做错了什么吗?

【问题讨论】:

    标签: objective-c cocoa nsdate nstimezone


    【解决方案1】:

    一个日期对象代表一个特定的时间点,与当时不同人的时钟可能表示什么无关。

    当您想要显示日期时会涉及时区,因为您通常会显示用户的时钟在那个时候会说(或正在说,或将说)的内容。这正是您 NSLog 一个 NSDate 时发生的情况:日期的描述是您当地时区所代表的那个时刻。

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

    为简化起见,时区转换是在空间中的不同点(行星表面的不同部分)中查看同一时间,而日期加减是计算不同的时间。

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

    【讨论】:

    • 嗯,你完全正确。我正在更改时间而不是空间点。
    【解决方案2】:

    我发现你回来的日期有不同的时区+200 而不是-400。如果您注意到,您会看到该结果比您的原始日期晚了 12 小时(或 6 小时 + 6 小时)。当您确定新日期时,您是否也偶然更改了语言环境?当您进行更改并开始为您提供 +200 而不是 -400 时,系统会自动调整时间以进行补偿,然后您又增加了 6 个小时。 NSDate 将所有日期存储为自 2001 年 1 月 1 日 GMT 以来的时间间隔,并根据需要调整时区。

    【讨论】:

    • 不,我没有改变它。但我认为 Peter Hosey 解释了问题所在。还是谢谢。
    • 真的吗?那为什么会有不同的时区偏移量,你没有添加的那些额外的 6 小时是从哪里来的?
    • theMikeSwan:我的猜测是他解析了一个包含 -0400 时区偏移量的日期字符串,然后进行了添加,然后使用 NSLog 记录了结果,它使用了他的本地时区(恰好是所需的目的地时区)。那个时区转换,加上他添加的 6 小时,占了 12 个时钟小时。
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多