[NSDate日期]和闰年的问题

时间:2012-03-01 03:35:57

标签: objective-c ios nsdate

在闰年,[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]来获取当前日期实际上是不好的做法吗?我错过了一些重要的东西吗?

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

1 个答案:

答案 0 :(得分:8)

我不知道你在哪里知道NSDate不支持闰日,但这绝对是错误的。我相信你会感到困惑,因为现在在GMT中,日期字符串是2012-03-01 03:42:07 +0000。这是正确的。在GMT,它已经是3月1日。但是,如果您要求当前区域设置中的日期(例如[[NSDate date] descriptionWithLocale:[NSLocale currentLocale]]),您将获得正确的闰日值。在PST,对我来说,它是

  

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

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