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;
}
答案 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的假设。这可以解释你的问题;但是,我没有检查它。