NSDateComponents中的错误日期

时间:2013-12-24 18:41:00

标签: ios nsdate

我正在创建一个NSDate。为什么这一天总是少一点?

这是代码:

NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [gregorian components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:today];
[comps setDay:31];
NSDate *lastDayOfMonth = [gregorian dateFromComponents:comps];
NSLog(@"last %@",lastDayOfMonth);

这是日志:

last 2013-12-30 23:00:00 +0000

结果是30而不是31

2 个答案:

答案 0 :(得分:1)

  • [NSDate date]返回'now'
  • 您要求提供此日期的年,日,月,而不是时间元素
  • 您将日期设置为31
  • 你要求日历将31 / thismonth / thisyear与notime转换为NSDate
  • 记录NSDate会打印出以UTC为单位的时间,因为它没有时间和分钟,所以这些显然设置为23:00,即正确日期前一小时。

简而言之,对我来说,这似乎是一个时区或夏令时。

所有这些日历时间计算都可能非常混乱,因此这是一个一般性建议:观看WWDC 2012和WWDC 2013关于日历计算(尤其是2012版本)。

答案 1 :(得分:1)

last 2013-12-30 23:00:00 +0000

这是因为你正在显示时间作为GMT - 也就是伦敦的时间。但你不在伦敦。我不知道你在哪里,但是如果你想到这一点,你就会意识到,当它在伦敦30日2300时,就在你所在的31日午夜,这正是你所要求的。