奇怪的弹性日期问题

时间:2009-06-27 07:43:04

标签: flex datetime

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分。为什么?这与二月只有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;
    }

2 个答案:

答案 0 :(得分:4)

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

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

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

这将获得两个时区之间的差异(以分钟为单位),将该值转换为毫秒,然后将时区差异应用于毫秒差异以“取消”DST边界。

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

答案 1 :(得分:0)

您的评论中有部分答案:2010年3月1日0:00至2010年3月31日0:00是30(!)天减去1小时(因为3月14日是2010年夏令时开始)。由于你得到了分工的结果,你得到29。

编辑:这个答案当然是基于Date的time属性考虑DST的假设。这可以解释你的问题;但是,我没有检查它。