【问题标题】:1 out error when creating NSDate from calendar components从日历组件创建 NSDate 时出现 1 个错误
【发布时间】: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


【解决方案1】:

您的结果正确

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;

【讨论】:

  • 您好 Martin R,感谢您的快速回复,但我不清楚如何更改我的代码。
  • @AndreiNagy:我相当确定您的代码到目前为止是正确的。但是要根据您的时区显示日期,您必须使用 NSDateFormatter。
  • @AndreiNagy - NSLog 调用 NSDate.description(),它总是返回相对于 GMT 的日期。
  • 感谢您的保证,Martin R。现在我对这个主题有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多