一位同事评论说“adding multiples of 86,400 is never the answer”.为什么会这样?
这是我创建的类别方法,我该如何改进?
- (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: 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一起工作.也在视频中解释.
总结以上是内存溢出为你收集整理的objective-c – 假设格里高利历,为什么将86,400(一天)的时间间隔添加到一个永不答案的日期?全部内容,希望文章能够帮你解决objective-c – 假设格里高利历,为什么将86,400(一天)的时间间隔添加到一个永不答案的日期?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)