Problems with [NSDate date] and the leap year
在闰年,[NSDate date] 返回 2012-03-01 HH:MM:SS +TTTT.
在 stackoverflow 上,我经常看到通过简单地调用 [NSDate date] 来检索今天日期的帖子。问题是在闰年这不会返回正确的日期。现在我明白闰年实际上是日历系统的一个函数,所以 NSDate 不会识别闰年(或夏令时)是有道理的。但是,这有可能破坏代码 - 例如:
假设您通过执行以下操作指定文件修改日期:
1 2
| // 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 |
然后在将来的某个时候进行比较以查看文件上次修改的时间:
1 2
| // 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。你的时区是什么?你是怎么显示日期的?
我不知道你从哪里得到NSDate 不支持闰日的想法,但这绝对是错误的。我相信您会感到困惑,因为现在在 GMT 中,日期字符串是 2012-03-01 03:42:07 +0000。这是对的。格林威治标准时间已经是 3 月 1 日。但是,如果您询问当前语言环境中的日期(例如 [[NSDate date] descriptionWithLocale:[NSLocale currentLocale]]),您将获得正确的闰日值。对 PST 中的我来说,它是
Wednesday, February 29, 2012 7:42:46 PM Pacific Standard Time
请注意,NSDate 本身不支持区域设置。我所做的唯一更改是要求它使用当前语言环境而不是使用 GMT 返回字符串表示形式。我可以使用相同的日期对象并询问 EST,它也会为我提供该时区的正确字符串。
- 哇...我觉得自己没有意识到这一点真是太可笑了!谢谢凯文的回答,你完全正确!那么 NSDate 是否真的考虑了诸如夏令时之类的事情?...
-
从技术上/严格上/迂腐(但我相信这加强了你的观点)NSDate 不"支持"闰日——这是日历/语言环境的一个功能。 NSDate 只是一个时间点;由日历系统为其提供标签或描述。
-
@JoshCaswell 我认为凯文所说的是,由于我们在太平洋标准时间,格林威治标准时间实际上是 3 月 1 日-如果是当天早些时候并且我打电话给 [NSDate date] 它将在 2 月 29 日的某个时间返回.
-
@Jake:我同意凯文的观点,尽管我可能说得不好。这个问题经常出现,我以前自己回答过。
-
@JakeV:从根本上说,NSDate 本身只是从参考日期(2001 年 1 月 1 日)起以秒为单位的偏移量。正如乔希所说,由日历将其转换为年/月/日/等,包括夏令时和闰日。