【问题标题】:NSDateComponents returns week 53 on 1/1/1970NSDateComponents 于 1970 年 1 月 1 日返回第 53 周
【发布时间】:2011-06-22 16:06:42
【问题描述】:

因此,当使用 NSCalendar 和 NSDateComponents 从 NSDate 对象中提取日期组件时,我遇到了一个奇怪的行为。 如果日期距离 1970 年 0 秒,则周组件将返回 53。 除了模数 52 的明显方法之外,是否有对此的解释或解决方法?

这是您可以在您的机器上运行以进行测试的代码:

-

 (void)testDate {
    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];
    NSDateComponents *comp = [cal components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSWeekCalendarUnit) fromDate:date];
    DLog(@"%d/%d/%d week: %d", [comp day],[comp month], [comp year], [comp week]);

}

这是输出:

31/12/1969 week: 53
(gdb) po date
1970-01-01 00:00:00 +0000
(gdb) 

【问题讨论】:

    标签: objective-c nsdate nscalendar nsdatecomponent


    【解决方案1】:

    我知道了,

    2011-06-22 22:38:50.516 SmallTasks[23164:903] 1/1/1970 week: 1
    

    所以我对你得到的结果有点惊讶,但我并不感到惊讶 week: 53 变成 52 * 7 = 364 并且我们一年有 365 天。为此,我预计这一周将从 1969 年的星期日开始,但事实并非如此。

    【讨论】:

    • 我得到了类似的结果,我也得到了第 1 周,但我得到了 1979 年 12 月 31 日,但这只是因为我的本地时区是 -0500。
    • 在阅读了更多关于它的信息后,我对第 53 周并不感到惊讶,但仍在检查为什么我有一天会得到组件
    【解决方案2】:

    你我的朋友发现了leap week。几年前我在做一些 SQL 报告时遇到过这种情况。

    【讨论】:

    • 我必须说我不确定为什么 1969 年会有闰周。另一方面,它打印 31/12/1969 的原因是因为您处于 - 时区。
    • 我没有添加任何时区计算,上面的代码正是没有运行调试器的代码,奇怪的是组件返回一天和一周指向 1969 年的相对一周跨度>
    • 那么你如何处理闰周/年呢?
    • 你的意图是什么?当我运行代码时,虽然我得到了第 1 周。1969 年不应该有 53 周。虽然 53 周是可能的,但它被公历的变体使用,并且您发布的代码应显示第 1 周。
    • @joe 1969 年不是闰年,1960 年、1964 年、1968 年是闰年
    猜你喜欢
    • 2020-06-18
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多