【问题标题】:JavaScript setUTCHours returns wrong dayJavaScript setUTCHours 返回错误的日期
【发布时间】:2014-04-24 23:59:40
【问题描述】:

当我注意到 setUTCHours() 返回错误的日期时,我一直在研究 Date() 对象。

例子:

var myDate = new Date(2014, 0, 1);
myDate.setUTCHours(10);
myDate;

看着这个,我预计日期是 2014 年 1 月 1 日星期三 10:00:00 UTC,但它却晚了一天。这是为什么呢?

这是我的http://jsfiddle.net/L5QEC/ 与其他一些基本方法的比较。

【问题讨论】:

  • 你在哪个时区?当您创建初始日期对象时,它是相对于您当地时区的 UTC,因此,如果您领先于 UTC,它将回到前一天,然后当您设置小时数时,它将是前一天的小时数天。
  • 谢谢@jraede!是的,我的时区是 UTC+1。我刚刚将我的计算机时区更改为 UTC-1 进行检查,现在它显示正确的日期。

标签: javascript date


【解决方案1】:

日期对象使用time value,即UTC。它们还有一个offset,表示主机系统的时区偏移量。默认情况下,日期和时间将使用偏移量来显示本地值。如果您是 UTC+1,则偏移量将为 -60,新的 Date(2014, 0, 1) 将为 2013-12-31T23:00:00Z 创建一个日期,并使用该偏移量显示本地日期 2014-01-01T00:00:00+0100

因此,如果您将 UTC 小时数更改为 10,则 UTC 时间为:2013-12-31T10:00:00Z,本地等效时间为 2013-12-31T11:00:00+0100

因此,通过将 UTC 小时数设置为 10,您可以有效地将本地时间设置为前一天的 11:00(即 UTC 小时数 + 1 小时偏移量)。

【讨论】:

  • 那么如果你想创建一个日期为1/1/2014 而UTC 时间为00:00+0000 会发生什么?这似乎很反直觉。
  • @MikeYoung——你会使用new Date(Date.UTC(2014,0,1))。 ;-)
【解决方案2】:

如果您想以 UTC 设置特定日期和时间,请考虑:

var dt = new Date(Date.UTC(2014, 0, 1, 10, 0, 0));

结果将代表世界时的该点,但您会看到它已调整为本地时区以进行显示。例如:

"Wed Jan 01 2014 02:00:00 GMT-0800 (Pacific Standard Time)"

【讨论】:

  • 这是我用来与我 (jsfiddle.net/L5QEC) 中的 setUTCHours 进行比较的示例之一。不过,我仍然很想知道这两种方法的不同之处。
【解决方案3】:

读取 UTC 日期,而不是本地(默认)日期:

var myDate = new Date(2014, 0, 1);
myDate.setUTCHours(10);
myDate.toUTCString();

【讨论】:

    【解决方案4】:

    一种肮脏的方法是在使用 setUTCHours

    之前将本地日期转换为 UTC
    function UTCDate() {
        var dateObject = new Date();
        var UTC = new Date(dateObject.getUTCFullYear(),
                  dateObject.getUTCMonth(), dateObject.getUTCDate(),
                  dateObject.getUTCHours(), dateObject.getUTCMinutes(),
                  dateObject.getUTCSeconds(),dateObject.getUTCMilliseconds());
       return UTC;
    }
    

    【讨论】:

      【解决方案5】:

      当时间为 0 小时 0 分钟时,基于 GMT 存在令人讨厌的 1 天延迟。

      例如,如果 GMT 为 +2,则日期的小时数必须大于 2,否则日期会少一天。

      我发现避免这种奇怪效果的解决方案是使用这个技巧。

      var myDate = new Date(2014, 0, 1);
      var timezoneOffset = myDate.getTimezoneOffset();
      if (timezoneOffset > 0) {
        myDate.setMinutes((24 * 60) - (timezoneOffset + 1));
      } else {
        myDate.setMinutes(-timezoneOffset); // Do not forget the negative sign !
      }
      myDate.setUTCHours(10);
      

      所以当我添加与 GMT 偏移量相对应的时间时,我不再有这个错误的日期!

      我通过更改操作系统的设置(-13、-2、+2、+12)测试了所有 GMT

      如果需要,您可以在此之后设置 UTC 分钟!

      getTimezoneOffset() 方法返回 UTC 时间与本地时间的时差,以分钟为单位。 例如,如果您的时区是 GMT+2,则将返回 -120。

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        相关资源
        最近更新 更多