2009-06-27 85 views
1

Flex令我疯狂,我认为它是如何处理闰年和没有闰年的奇怪问题。所以这是我的例子。我有下面的dateDiff方法来查找两个日期之间的天数或毫秒数。如果我运行以下三条语句,我会遇到一些奇怪的问题。奇怪的弹性日期问题

 dateDiff("date", new Date(2010, 0,1), new Date(2010, 0, 31)); 
    dateDiff("date", new Date(2010, 1,1), new Date(2010, 1, 28)); 
    dateDiff("date", new Date(2010, 2,1), new Date(2010, 2, 31)); 
    dateDiff("date", new Date(2010, 3,1), new Date(2010, 3, 30)); 

如果您要查看上面的日期比较,您期望获得30,27,30和29作为日期之间的天数。奇怪的部分是,比较3月1日至3月31日,我得到29。为什么?这与2月份只有28天有关吗?如果有人对此有任何意见,将不胜感激。

public static function dateDiff(datePart:String, startDate:Date, endDate:Date):Number 
    { 
     var _returnValue:Number = 0; 

     switch (datePart) { 
      case "milliseconds": 
       _returnValue = endDate.time - startDate.time; 
       break; 
      case "date": 
       // TODO: Need to figure out DST problem i.e. 23 hours at DST start, 25 at end. 
       // Math.floor causes rounding down error with DST start at dayOfYear 
       _returnValue = Math.floor(dateDiff("milliseconds", startDate, endDate)/(1000 * 60 * 60 * 24)); 
       break; 
     } 

     return _returnValue; 
    } 

回答

4

这不是闰年问题,而是夏时制问题。

要更正代码以说明DST,您需要查看两个日期的timezoneOffset以确定日期范围是否跨越DST边界。

var adjustment:Number = (startDate.timezoneOffset - endDate.timezoneOffset) * 60 * 1000; 
_returnValue = endDate.time - startDate.time + adjustment; 

这将让(分钟)两个时区之间的差别,该值转换成毫秒,然后应用时区差到毫秒差“抵消”的DST边界。

当然,当两个数字在同一时区时,调整值变为0,并且时间值不调整。

+0

太棒了!非常感谢您发布代码示例。这完美地解决了我的问题。 – CodeMonkey 2009-06-29 17:43:52

0

您的评论部分答案:2010-MAR-01 0:00直到2010-MAR-31 0:00是三十天数减去一个小时(因为3月14日是DST开始(!)在2010年)。由于你的分区的结果,你会得到29.

编辑:这个答案当然是基于日期的时间属性考虑夏时制的假设。这会解释你的问题;然而,我没有检查它。