【发布时间】:2013-10-06 06:34:05
【问题描述】:
我正在尝试使用“NSDate for first day of the month”中提供的解决方案来获取月份的第一天。
我的代码属于 NSDate 类别:
- (NSDate *)firstDayInMonthOfDate {
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:self];
comps.timeZone = calendar.timeZone;
NSDate *startDate;
[comps setDay:1];
startDate = [calendar dateFromComponents:comps];
return startDate;
}
这会产生上个月的最后一天......示例:
self = date: 2013-11-02 22:00:00
comps = <NSDateComponents: 0x749b4c0>
TimeZone: Europe/Bucharest (GMT+03:00) offset 10800 (Daylight)
Calendar Year: 2013
Month: 11
Leap month: no
Day: 1
startDate = 2013-10-31 22:00:00 +0000
所以,为了得到正确的日期,我必须设置 comps.day = 2。我只是不明白额外的 1 是从哪里来的。
[编辑] 我想使用集合视图单元格的日期,所以我想要一种可靠的方法来获取当月的第一个日期,例如。 2013-11-01
[编辑] 使用 NSDateFormatter 打印日期会给出正确的结果 (2013-10-31)。 po 和 NSLog 的问题在于它们没有正确解释时区(2012-12-31 10pm + 3h GMT != 2013-01-01 12am) 推荐一个日期编程教程:http://rypress.com/tutorials/objective-c/data-types/dates.html
【问题讨论】:
-
TIME ZONE -- 这是(至少)在过去一两个小时内第二次回答这个问题。并且被骗了很多次。
-
如果你只是复制和粘贴代码,如果你不理解它,你应该不会感到惊讶。
标签: ios objective-c cocoa-touch