关于objective C:[NSDate 日期] 和闰年的问题

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] 获取当前日期实际上是不好的做法吗?我在这里遗漏了什么重要的东西吗?

抱歉问了一个冗长的问题...


我不知道你从哪里得到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,它也会为我提供该时区的正确字符串。