【问题标题】:NSDateComponents Acting Up On SimulatorNSDateComponents 在模拟器上起作用
【发布时间】:2012-01-30 21:14:14
【问题描述】:

我有以下代码。当我在我的 iOS 3.1.3 设备上运行它时(克服它!)它按预期工作,但是当我在模拟器(iOS 5 和 4.3)上运行它时,它减少了 1 分 15 秒(9:01:15 )。这是因为我的代码,模拟器中的错误还是iOS 4+中的错误?

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]];
components.hour = 9;
components.minute = 0;
NSDate *date = [calendar dateFromComponents:components]; // <-- date is off on simulator

感谢您的帮助!

【问题讨论】:

    标签: ios nsdate nscalendar nsdatecomponents


    【解决方案1】:

    我不完全理解为什么会这样,但是当您使用dateFromComponents: 创建很久以前的日期时会发生这种情况。具体来说,截止日期似乎是 1847 年 12 月 1 日。当天上午 12 点之前的任何时间似乎最终都是 1 分 15 秒。

    在您的情况下发生这种情况是因为如果您只设置 components.hourcomponents.minute,您将得到一个从公元 1 月 1 日开始的日期。

    如果您将年、月和日期设置为较新的值,如下所示:

    components.year = 2012;
    components.month = 2;
    components.day = 6;
    

    然后你会得到正确的输出(我在 iOS 模拟器中得到的):

    2012-02-06 09:00:00 +0000
    

    【讨论】:

    • 可能是因为(根据维基百科)这是公司切换到英国标准时间的时候 (en.wikipedia.org/wiki/Railway_time#Great_Britain)。
    • 谢谢你——以及历史花絮:)
    • 如果您未在日期组件中指定时区,则转换将采用当前时区。对于历史日期,时区库将在某些时候假定实际的本地时间(即 UTC 线以东/以西的实际分钟和秒)。在 1847 年之前,伦敦位于(当前)格林威治标准时间以西 75 秒处,因此您的值正在被解释。见stackoverflow.com/questions/21921589/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2016-05-22
    • 2016-06-29
    相关资源
    最近更新 更多