【问题标题】:Problems with [NSDate date] and the leap year[NSDate date] 和闰年的问题
【发布时间】:2012-03-19 14:20:56
【问题描述】:

在闰年,[NSDate date] 返回2012-03-01 HH:MM:SS +TTTT

在 stackoverflow 上,我经常看到通过简单地调用 [NSDate date] 来检索今天日期的帖子。问题是在闰年这不会返回正确的日期。现在我明白闰年实际上是日历系统的函数,所以NSDate 不会识别闰年(或夏时制)是有道理的。但是,这有可能破坏代码 - 例如:

假设您通过以下方式指定文件修改日期:

// assume today's date is 2012-02-29 10:00:00 +0000
NSDate *fileModificationDate = [NSDate date];    // 2012-03-01 10:00:00 +0000 is returned

然后在将来的某个时间进行比较以查看文件上次修改的时间:

// assume it's the next day at 9 AM, ie 2012-03-01 09:00 +0000
NSTimeInterval timeSinceLastModification = [fileModificationDate timeIntervalSinceNow];

返回的timeSinceLasModification 将是正数,表示未来的某个时间没有意义!

我的问题是:使用[NSDate date] 获取当前日期实际上是不好的做法吗?我在这里遗漏了什么重要的东西吗?

抱歉这个冗长的问题...

【问题讨论】:

  • 无复制。通过NSLog 打印[NSDate date] 对我来说一整天都是2/29。你的时区是什么时候?你是如何显示日期的?

标签: objective-c ios nsdate


【解决方案1】:

我不知道你从哪里得到NSDate 不支持闰日的想法,但这绝对是错误的。我相信您会感到困惑,因为现在在 GMT 中,日期字符串是 2012-03-01 03:42:07 +0000。这是正确。格林威治标准时间已经是 3 月 1 日。但是,如果您询问当前语言环境中的日期(例如[[NSDate date] descriptionWithLocale:[NSLocale currentLocale]]),您将获得正确的闰日值。对 PST 的我来说,这是

太平洋标准时间 2012 年 2 月 29 日星期三晚上 7:42:46

请注意,NSDate 本身不支持区域设置。我所做的唯一更改是要求它使用当前语言环境而不是使用 GMT 返回字符串表示形式。我可以使用相同的日期对象并询问 EST,它也会为我提供该时区的正确字符串。

【讨论】:

  • 哇...我为不接受这一点而感到非常荒谬!谢谢你的回答凯文,你是完全正确的!那么 NSDate 是否真的考虑了诸如夏令时之类的事情?......我可以发誓我读过一些关于它的东西而不是这样做
  • 技术/严格/迂腐(但我相信这强化了你的观点)NSDate “支持”闰日——这是日历/语言环境的功能. NSDate 只是一个时间点;由日历系统为其提供标签或描述。
  • @JoshCaswell 我认为凯文的意思是,因为我们在太平洋标准时间,所以在格林威治标准时间实际上是 3 月 1 日 - 如果它是在当天早些时候并且我打电话给 [NSDate date] 它会返回2 月 29 日某个时间。
  • @Jake:我同意凯文的观点,尽管我可能说得不好。这个问题经常出现,我之前自己回答过。
  • @JakeV:NSDate 本身基本上只是从参考日期(2001 年 1 月 1 日)开始以秒为单位的偏移量。正如 Josh 所说,将其转换为年/月/日/等取决于日历,包括 DST 和闰日。
猜你喜欢
  • 2021-01-31
  • 2014-06-11
  • 2014-10-26
  • 1970-01-01
  • 2017-10-04
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多