【问题标题】:Wrong date in NSDateComponentsNSDateComponents 中的日期错误
【发布时间】:2013-12-24 18:41:00
【问题描述】:

我正在创建一个 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

【问题讨论】:

标签: ios nsdate


【解决方案1】:
last 2013-12-30 23:00:00 +0000

这是因为向您显示格林威治标准时间 - 即伦敦时间。但你不在伦敦。我不知道你在哪里,但如果你仔细想想你会发现,当伦敦 30 日 2300 时,你所在的地方就是 31 日午夜,这正是你所要求的。

【讨论】:

  • 完美,谢谢,但是如何将最后一个数字从 +0000 更改为当前时区?
  • 制作你自己的 NSDateFormatter,而不是像上面那样使用默认的。默认日期格式化程序使用 GMT 时区。如果您制作自己的 NSDateFormatter,则可以将其 timeZone 设置为您喜欢的任何内容。例如,您可以将其设置为[NSTimeZone localTimeZone]
  • 但这不是重点。关键是你实际上得到了正确的答案。只是当你看到它时你不知道它,因为你没有仔细看它。 NSDate 必须显示为 some 时区,如果您查看此处使用的时区,您会发现您得到的答案是正确的答案。
【解决方案2】:
  • [NSDate 日期] 返回“现在”
  • 您要求提供此日期的年、日和月,而不是时间元素
  • 您将日期设置为 31
  • 您要求日历将 31/thismonth/thisyear with notime 转换为 NSDate
  • 记录 NSDate 会以 UTC 格式打印出时间,由于它没有小时和分钟,因此这些显然设置为 23:00,即正确日期前一小时。

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

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

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2011-12-27
    相关资源
    最近更新 更多