日期类 setMonth 设置奇怪的值
Posted
技术标签:
【中文标题】日期类 setMonth 设置奇怪的值【英文标题】:Date class setMonth sets weird values 【发布时间】:2016-06-19 17:46:43 【问题描述】:我有以下测试代码:
var d1 : Date = new Date("2016/02/20 15:00:00 UTC-0000");
trace(d1.toUTCString());
d1.monthUTC++;
trace(d1.toUTCString());
var d2 : Date = new Date("2016/03/31 15:00:00 UTC-0000");
trace(d2.toUTCString());
d2.monthUTC++;
trace(d2.toUTCString());
这个痕迹
[trace] Sat Feb 20 15:00:00 2016 UTC
[trace] Sun Mar 20 15:00:00 2016 UTC
[trace] Thu Mar 31 15:00:00 2016 UTC
[trace] Sun May 1 15:00:00 2016 UTC
为什么第二个例子中的日期跳了 1 个月又 1 天,而不是仅仅一个月? (从 3 月 31 日到 5 月 1 日)?
【问题讨论】:
【参考方案1】:我认为解决方案在于 Date 类的内部工作方式:
当我将日期设置为每月 31 日时,例如:"2016/03/31 15:00:00 UTC-0000"
我将月份加一,内部变为:"2016/04/31 15:00:00 UTC-0000"
然后再次在内部解决。但是由于四月只有30天,日期溢出到五月:"2016/05/01 15:00:00 UTC-0000"
如果我尝试将 date
字段设置为 4 月 31 日,也会发生同样的情况。
这也意味着官方的 ActionScript 文档是错误的:
setUTCMonth()
以通用时间 (UTC) 设置月份和可选的日期,并以毫秒为单位返回新时间。调用此方法不会修改其他字段,但如果调用此方法导致星期几发生变化,Date.getUTCDay() 和 Date.getDay() 方法可能会报告一个新值。
当设置月份也会改变日期时,他们没有想到这种极端情况。
同样的事情也发生在 javascript 中。
【讨论】:
以上是关于日期类 setMonth 设置奇怪的值的主要内容,如果未能解决你的问题,请参考以下文章
CalendarUtil.addMonthsToDate()和JsDate.setMonth()在GWT中给出错误的日期