Javascript将日期转换为UTC(如果已经是UTC,则保留未修改状态)

时间:2017-02-09 07:26:09

标签: javascript date datetime

首先,我知道如何在Javascript中将本地日期转换为UTC。这不是重复的。

我一直试图获得一个将日期转换为UTC的功能,如果它还没有,我无法控制输入是否为UTC。我无法使用Javascript插件。

普通解决方案只是将本地日期解析为UTC,但解析已经是UTC的日期会输出错误修改已经发布的UTC日期的奇怪行为

我在下面有一个示例函数。

function temp() {
  var utc = new Date(Date.UTC(2017, 1, 10, 10, 10, 0));
  var local = new Date(2017, 1, 10, 10, 10, 0);

  var utc2 = new Date(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate(),  utc.getUTCHours(), utc.getUTCMinutes(), utc.getUTCSeconds());
  var local2 = new Date(local.getUTCFullYear(), local.getUTCMonth(), local.getUTCDate(),  local.getUTCHours(), local.getUTCMinutes(), local.getUTCSeconds());

  var utc3 = new Date(utc.getTime() + utc.getTimezoneOffset()*60*1000);
  var local3 = new Date(local.getTime() + local.getTimezoneOffset()*60*1000);

  Logger.log("Timezone offset: UTC=" + utc.getTimezoneOffset() + " Local=" + local.getTimezoneOffset());
  Logger.log("UTC: " + utc.getTime() + " -> UTC2(" + utc2.getTime() + ") or UTC3(" + utc3.getTime() +")");
  Logger.log("Local: " + local.getTime() + " -> UTC2(" + local2.getTime() + ") or UTC3(" + local3.getTime() +")");
}

返回

Timezone offset: UTC=420 Local=420
UTC: 1486721400000 -> UTC2(1486746600000) or UTC3(1486746600000)
Local: 1486746600000 -> UTC2(1486771800000) or UTC3(1486771800000)

请注意,即使是UTC日期也有时区偏移量。并且将本地日期转换为UTC的两种方法都会将已经发生的UTC日期修改为不正确的日期。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这种行为并不奇怪,遗憾的是你的问题没有答案(使用默认的JavaScript Date实现)。

在JavaScript中,每个Date由纪元以来的毫秒表示。 Date实例始终在解释器(例如,您的浏览器)时区内处理。因此,当您致电new Date(Date.UTC(2017, 1, 10, 10, 10, 0));时,实际上您创建了一个Date实例,该实例由1486721400000内部表示。

getTimezoneOffset()方法始终从当前时区的角度返回值。所以在我的案例中(加利福尼亚州),以下内容:

document.write(new Date(Date.UTC(2017, 1, 8, 10, 0, 0)).toString());
document.write("<br/>");
document.write(new Date(Date.UTC(2016, 8, 8, 10, 0, 0)).toString());

输出(带注释)

480 // Wed Feb 08 2017 02:00:00 GMT-0800 (PST)
420 // Thu Sep 08 2016 03:00:00 GMT-0700 (PDT)

试图找到问题的答案

我能想到的唯一解决方案是,您创建自己的Date实施(因为您不想使用任何&#34;插件&#34;)。您可以创建自己的Date,它也可以存储时区,或者只有一个标志,用于定义Date是否在UTC中。如果您重新考虑使用JavaScript库,可能需要查看,例如https://momentjs.com/timezone/

以下是有关如何开始使用自己的实现的示例

&#13;
&#13;
function TzDate (date, utc) {
  if (date instanceof Date) {
    this.date = date;
    this.utc = utc ? true : false;
  } else if (typeof date === 'number') {
    this.date = new Date(date);
    this.utc = true;
  } else if (typeof date === 'boolean') {
    this.date = new Date();
    this.utc = date;
  } else {
    this.date = new Date();
    this.utc = utc ? true : false;
  }
}
 
TzDate.prototype = {
  toString: function() {
    return this.isUTC() ? this.date.toUTCString() : this.date.toString()
  },
  
  getTimezoneOffset: function() {
    return this.isUTC() ? 0 : this.date.getTimezoneOffset();
  },

  isUTC: function() {
    return this.utc;
  }
};

console.log(new TzDate().toString());
console.log(new TzDate(true).toString());
console.log(new TzDate(Date.UTC(2017, 1, 8, 10, 0, 0)).toString());
console.log(new TzDate(new Date(2017, 1, 8, 10, 0, 0)).toString());
&#13;
&#13;
&#13;

另见:

相关问题