0

我正在尝试使用“每月第一天的 NSDate ”中提供的解决方案来获取每月的第一天。

我的代码属于 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

4

1 回答 1

2

你的结果是正确的

NSLog(@"%@", startDate)po startDate在调试器中始终打印相对于 GMT 的日期,并且

 startDate = 2013-10-31 22:00:00 +0000

与 GMT+2 中的 2013-11-01 00:00:00 相同,这是您的时区。

请注意,您可以将代码简化为

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startDate;
[calendar rangeOfUnit:NSMonthCalendarUnit startDate:&startDate
             interval:NULL forDate:self];
return startDate;
于 2013-10-06T08:03:08.113 回答