objective-c – 假设格里高利历,为什么将86,400(一天)的时间间隔添加到一个永不答案的日期?

objective-c – 假设格里高利历,为什么将86,400(一天)的时间间隔添加到一个永不答案的日期?,第1张

概述我创建了一种方法来计算一周的第一天和最后一天,方法是将一天的时间间隔(86,400)添加到日期,再乘以所需的天数. 一位同事评论说“adding multiples of 86,400 is never the answer”.为什么会这样? 这是我创建的类别方法,我该如何改进? - (NSDate*)firstDayOfWeek{ return [self dateWithDaysAd 我创建了一种方法来计算一周的第一天和最后一天,方法是将一天的时间间隔(86,400)添加到日期,再乘以所需的天数.

一位同事评论说“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(一天)的时间间隔添加到一个永不答案的日期?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1007513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存