【问题标题】:Setting UTC date seems to be using daylight savings设置 UTC 日期似乎正在使用夏令时
【发布时间】:2013-08-03 00:16:20
【问题描述】:

当我尝试添加日期的月份时,它会跳过 11 月。我相信这是因为 11 月的夏令时。

这里的代码显示它比我想要的多一天跳跃:

var my_date = new Date(1377993599000);
console.log(my_date.toUTCString());

这将输出“2013 年 8 月 31 日星期六 23:59:59 GMT”

my_date.setUTCMonth(my_date.getUTCMonth() + 3);
console.log(my_date.toUTCString());

这会输出“Sun, 01 Dec 2013 23:59:59 GMT”

现在,当我尝试只添加 2 时:

my_date.setUTCMonth(my_date.getUTCMonth() + 2);
console.log(my_date.toUTCString());

这将输出“2013 年 10 月 31 日星期四 23:59:59 GMT”

当我尝试将日期设置为零时:

my_date.setUTCMonth(my_date.getUTCMonth() + 3, 0);
console.log(my_date.toUTCString());

这将输出“2013 年 10 月 31 日星期四 23:59:59 GMT”

有人知道解决这个问题的干净技巧吗?

我是否最好放弃 UTC 功能并简单地从所有时间中删除时区偏移量?如果我这样做,它真的能解决我的问题吗?

【问题讨论】:

    标签: javascript date utc dst


    【解决方案1】:

    没有 11 月 31 日,因此当您将月份加 3 时,它别无选择,只能滚动到下个月,即 12 月 1 日。

    可靠地向前推进几个月的问题是棘手的。您可以在执行此操作之前将日期 (.setDate()) 设置为 1,但随后您必须决定如何将其设置回与原始日期相关的内容。

    【讨论】:

    • 打败我,将包括一些关于获取本月最后一天的内容(将后一个月的日期设置为 0
    • 你成功了。而这样做的方式是:my_date.setUTCMonth(end_date.getUTCMonth() + 4, 0);
    • @eli——你只想将日期设置为零,你已经滚动到下个月,所以你一般不能这样做。
    【解决方案2】:

    Pointy 的回答是正确的,这是一个允许不均匀月份的函数:

    /* Given a date object, add months (may be +ve or -ve)
    ** Allow for uneven length months, e.g.
    **
    **   30 Jan 2013 + 1 month => 30 Feb => 2 Mar
    **
    ** so make 28 Feb. Also works for subtraction
    **/
    function addMonths(date, months){
      // Copy date, avoid IE bug for early dates
      var d = new Date(date.getTime());
      months = Number(months);
      d.setMonth(d.getMonth() + months);
      var check = d.getMonth() - date.getMonth() + months;
    
      // If rolled over to next month, go to last day of previous month
      if (check) {
        d.setDate(0); 
      }
      return d;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 2023-04-06
      • 1970-01-01
      • 2017-03-08
      • 2016-02-06
      相关资源
      最近更新 更多