假设您网站的用户输入了一个日期范围。

2009-1-1 to 2009-1-3

您需要将此日期发送到服务器进行某些处理,但服务器要求所有日期和时间均为UTC。

现在假设用户在阿拉斯加。由于它们所处的时区与UTC完全不同,因此需要将日期范围转换为如下所示:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

使用JavaScriptDate对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?


当前回答

您可以使用以下方法将任何js日期转换为UTC:

let date = new Date(YOUR_DATE).toISOString()

// It would give the date in format "2020-06-16T12:30:00.000Z" where Part before T is date in YYYY-MM-DD format, part after T is time in format HH:MM:SS  and Z stands for UTC - Zero hour offset

其他回答

var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

甚至更简单

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

简单又愚蠢

var date=新日期();var now_utc=日期utc(Date.getUTCFullYear(),Date.getUTCMonth(),date.getUTCDate(),date.getUTPours(),date.getUTCMinutes(),date.getUTCSeconds());console.log(新日期(now_utc));console.log(date.toISOString());

你想把日期转换成这样的字符串吗?

我会制作一个函数来实现这一点,尽管有点争议,但还是将其添加到Date原型中。如果你不习惯这样做,那么你可以把它作为一个独立的函数,把日期作为一个参数传递。

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

如果您在UTC时间需要它,只需使用getUTC*替换所有get*函数,例如:getUTCFullYear、getUTCMonth、getUTCHours。。。然后在末尾添加“+00:00”而不是用户的时区偏移。

浏览器可能会有所不同,你也应该记住不要相信客户端生成的任何信息,也就是说,下面的声明适用于我(Mac OS X 10.8.2上的Google Chrome v24)

var utcDate=新日期(new Date().getTime());


edit:“这和new Date()有什么不同?”请参见此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

如果未提供任何参数,则构造函数将根据系统设置为当前日期和时间创建JavaScript Date对象。注意:当Date作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要UTC,请使用具有相同参数的新日期(Date.UTC(…))。(注意:Date.UTC()返回自1970-01-01 00:00:00 UTC以来的毫秒数)


如前面的答案所述,添加60000*Date.getTimezoneOffset()是不正确的。首先,您必须将所有日期/时间视为UTC,并使用时区修饰符进行显示。

同样,浏览器可能有所不同,然而,Date.getTime()返回自1970-01-01 UTC/GMT以来的毫秒数。如果您像我上面所做的那样使用这个数字创建一个新的日期,它将是UTC/GMT。但是,如果通过调用.toString()来显示它,它将显示在本地时区中,因为.toString()使用的是本地时区,而不是调用它的Date对象的时区。

我还发现,如果您在日期上调用.getTimezoneOffset(),它将返回您的本地时区,而不是您调用它的日期对象的时区(但我无法验证这是否是标准的)。

在我的浏览器中,添加60000*Date.getTimezoneOffset()将创建一个不是UTC的DateTime。然而,当在我的浏览器中显示(例如:.toString())时,它会在我的本地时区中显示一个DateTime,如果忽略时区信息,该DateTime将是正确的UTC时间。