日期类 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中给出错误的日期

js日期

使用edit-text中提供的值设置日历类实例

获取日期 - 3 个月

为啥 NSDate() 在 CoreData 中存储一个奇怪的值

日期类 DataCalendarSimpleDateFormat