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

2009-1-1 to 2009-1-3

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

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

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

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


当前回答

const event = new Date();

console.log(event.toUTCString());

其他回答

如果您的日期上有时区,则可以使用date fns tz:

import { zonedTimeToUtc } from 'date-fns-tz';

const dateBrazil = new Date() // I'm in Brazil, you should have or get the user timezone.
const dateUtc = zonedTimeToUtc(dateBrazil, 'America/Sao_Paulo')

使用moment包,您可以轻松地将UTC的日期字符串转换为新的date对象:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

当您的服务器不支持时区,并且您希望将UTC日期始终存储在服务器中,并将其作为新的日期对象取回时,这特别有用。以上代码适用于我的需求,也适用于本线程的类似问题。在这里分享,这样可以帮助其他人。我在任何答案中都看不到上述解决方案。谢谢

toISOString()方法返回简化扩展ISO格式的字符串格式(ISO 8601),总是24或27个字符长(YYYY-MM-DDTH:MM:ss.sssZ或±YYYY-MM-dDTH:MM:ss.sssZ,分别)。时区始终为零UTC偏移,如后缀“Z”。

来源:MDN网络文档

您需要的格式是用.toISOString()方法创建的。对于本机不支持此方法的旧浏览器(ie8及以下版本),可以在此处找到垫片:

这将使您能够执行所需的操作:

var isoDateString=新日期().toISOString();console.log(isoDateString);

对于时区工作,moment.js和moment.jstimezone是非常宝贵的工具。。。特别是用于在客户端和服务器javascript之间导航时区。

甚至更简单

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

扩展功能:

if (!Date.prototype.toUTC){
    Date.prototype.toUTC = function(){
        var utcOffset = new Date().getTimezoneOffset();
        var utcNow    = new Date().addMinutes(utcOffset);
        return utcNow;
    };
}

用法:

new Date().toUTC();