gpt4 book ai didi

Objective-C:获取日历年中的天数

转载 作者:太空狗 更新时间:2023-10-30 03:33:25 27 4
gpt4 key购买 nike

我正在使用以下 NSCalendar 方法来获取日历年中的天数:

NSRange range = [gregorian rangeOfUnit:NSDayCalendarUnit 
inUnit:NSYearCalendarUnit
forDate:date];

我期望 range.length 类型的 NSRange 返回值是 365 或 366(天)。

但是,对于 2005-06-06 的日期值,此代码返回 range.length31

我的代码有什么问题?

这是完整的代码片段:

NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];

[subArray enumerateObjectsUsingBlock:
^(NSDate *date, NSUInteger idx, BOOL *stop) {
NSUInteger numberOfDays = [gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSYearCalendarUnit forDate:date];
}];

最佳答案

计算给定日期一年中的天数:

NSDate *someDate = [NSDate date];

NSDate *beginningOfYear;
NSTimeInterval lengthOfYear;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian rangeOfUnit:NSYearCalendarUnit
startDate:&beginningOfYear
interval:&lengthOfYear
forDate:someDate];
NSDate *nextYear = [beginningOfYear dateByAddingTimeInterval:lengthOfYear];
NSInteger startDay = [gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSEraCalendarUnit
forDate:beginningOfYear];
NSInteger endDay = [gregorian ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSEraCalendarUnit
forDate:nextYear];
NSInteger daysInYear = endDay - startDay;

遗憾的警告:这在 1582 年不能正常工作。

1582 年,也就是格雷戈尔引入目前广泛使用的历法的那一年,需要一个修正来使阳历与历年保持一致。所以他们采用了务实的解决方案:他们刚刚放弃了 10 月 5 日至 14 日。 (他们也没有疯狂到改变工作日)。结果 1582 年只有 355 天。

附录: 上面的代码仅适用于 1582 年之后的年份。例如,它返回 1500 年的 365 天,即使今年是当时使用的儒略历中的闰年。公历从 1582 年 10 月 15 日开始。在公历上进行的计算在该日期之前没有定义。所以这样苹果的实现是正确的。我不知道 1583 年之前在 Cocoa 上的正确实现。

关于Objective-C:获取日历年中的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14941024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com