NSCalendar 月份范围

Posted

技术标签:

【中文标题】NSCalendar 月份范围【英文标题】:NSCalendar months range 【发布时间】:2013-09-10 12:59:15 【问题描述】:

这段代码

NSDateComponents *component = [[NSDateComponents alloc] init];
NSCalendar       *gregorian = [[NSCalendar alloc]   initWithCalendarIdentifier:NSGregorianCalendar];
[component setMonth:1];
[component setYear:2013];
[component setDay:1];
currentMonth = [gregorian dateFromComponents:component];
NSLog(@"Date in MonthView %@ ",currentMonth);

给我以下日期

Date in MonthView 2012-12-31 23:00:00 +0000

为什么?月份范围应该是从 0 到 11?

【问题讨论】:

你的组件月份已经是你加了 1 所以问题来了。设置你的月份是 0。 我不明白:如果我想将月份设置为1并获取日期,为什么我不能设置它? 添加[component setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 【参考方案1】:

不,月份是从 1 到 12。这可能是因为您的设备/PC 的时区。设置timezine,你应该有你期望的日期

[component setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]

【讨论】:

【参考方案2】:

实际上,答案可能取决于您使用的日历(我看到您使用的是公历,但您的用户可能没有)。

了解给定日期组件范围的最安全方法是查询它的日历。另请注意,它可能会有所不同(例如,公历中 的最小范围是 1-28,而最大值是 1-31)。

NSRange minimumMonthRange = [yourCalendar minimumRangeOfUnit:NSMonthCalendarUnit];

原答案

来自“日期和时间编程指南”中的示例:

[...] 年单位是 2004 年,月单位是 5,日单位是 6(在公历中是 2004 年 5 月 6 日)。

因为飞蛾会去一月、二月、三月、四月、五月……他们用 5 表示五月,我会说月份的范围是 1 到 12。

【讨论】:

以上是关于NSCalendar 月份范围的主要内容,如果未能解决你的问题,请参考以下文章

dateFromComponents 返回错误值

OC -- NSCalendar的使用 与OC的反射

Foundation框架中的NSCalendar

如何同时支持 iOS 7 和 8 的 NSCalendar?

利用NSCalendar类实现日期的比较

NSDate/NSCalendar 问题