我创建了一种方法来计算一周的第一天和最后一天,方法是将一天的时间间隔 (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(使用前将#替换为@)