首先,我知道如何在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日期修改为不正确的日期。
感谢您的帮助。
答案 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/。
以下是有关如何开始使用自己的实现的示例
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;
另见: