假设采用公历,为什么在日期中添加 86,400(一天)的时间间隔始终无法解决问题?

2024-04-06

我创建了一种方法来计算一周的第一天和最后一天,方法是将一天的时间间隔 (86,400) 添加到日期,然后乘以所需的天数。

一位同事评论道“添加 86,400 的倍数永远不是答案 https://stackoverflow.com/a/17259765/404201”。为什么会这样呢?

这是我创建的类别方法,我该如何改进它?

- (NSDate*)firstDayOfWeek
{
    return [self dateWithDaysAddedGivenDayOfWeek:@{
        @1 : @-6,
        @2 : @0,
        @3 : @-1,
        @4 : @-2,
        @5 : @-3,
        @6 : @-4,
        @7 : @-5
    }];
}

- (NSDate*)lastDayOfWeek
{
    return [self dateWithDaysAddedGivenDayOfWeek:@{
        @1 : @0,
        @2 : @6,
        @3 : @5,
        @4 : @4,
        @5 : @3,
        @6 : @2,
        @7 : @1
    }];
}

- (NSDate*)dateWithDaysAddedGivenDayOfWeek:(NSDictionary*)daysToAddGivenDay
{
    NSDateComponents* components = [[NSCalendar currentCalendar]
        components:NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit fromDate:self];

    NSInteger daysToAdd = [[daysToAddGivenDay objectForKey:@([components weekday])] integerValue];
    return [self dateByAddingTimeInterval:daysToAdd * 60 * 60 * 24];
}

我需要在一天中使用不同的时间间隔吗? (例如23小时56分钟4.1秒)


你不能假设日子的长度相同。由于夏令时,它们的长度可能为 23、24 或 25 小时。很容易想象,如果我们假设一天的长度正好是 24*60*60 秒,那么可能会造成什么麻烦。

此外,您的代码可能有问题,因为在不同的国家和文化中,一周的第一天可能会有所不同(星期日与星期一)。因此,时间和日期的计算必须考虑日历和用户区域设置。这不是简单地通过数秒来完成的。

我们甚至还没有提到更令人讨厌的事情,比如闰秒、政客改变国家时区(普京领导下的俄罗斯、佛朗哥领导下的西班牙),甚至将它们移过国际日期变更线(参考萨摩亚——他们做了两次)。

所以你应该相信框架的工具,在WWDC2011:执行日历计算 https://developer.apple.com/videos/wwdc/2011/#performing-calendar-calculations.

对于您在问题中发布的代码,我会建议类似的东西

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
NSDate *startOfTheWeek;
NSDate *endOfWeek;
NSTimeInterval interval;
[cal rangeOfUnit:NSWeekCalendarUnit 
       startDate:&startOfTheWeek 
        interval:&interval //<-- interval will hold the length of the time unit, 
         forDate:now];     //    here week, taking DST et al into account
//startOfWeek holds now the first day of the week, according to locale (monday vs. sunday)

endOfWeek = [startOfTheWeek dateByAddingTimeInterval:interval-1];
// holds 23:59:59 of last day in week.

在您的情况下,另一个选择是跳过 NSDate,因为它们不代表一天,而是代表一个特定的时刻,并与 NSDateComponents 一起使用。视频里也有解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

假设采用公历,为什么在日期中添加 86,400(一天)的时间间隔始终无法解决问题? 的相关文章

随机推荐