如何将 JavaScript 日期转换为 UTC?

IT技术 javascript date utc
2021-02-08 09:16:54

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

2009-1-1 to 2009-1-3

您需要将此日期发送到服务器进行某些处理,但服务器希望所有日期和时间都采用 UTC。

现在假设用户在阿拉斯加、夏威夷或斐济。由于它们位于与 UTC 完全不同的时区,因此需要将日期范围转换为如下所示的内容:

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

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

6个回答

简单而愚蠢

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);
我想出的获得 UTC 日期和时间的最短代码是去掉时区: new Date(new Date().toUTCString().substr(0, 25))
2021-03-14 09:16:54
这是无稽之谈。新日期将具有与您实际想要的不同的值。只需使用now.toUTCSTring()而不是 (错误) now_utc.toString()
2021-03-21 09:16:54
我不会使用它 - 通过使用 new Date() 您可以获得浏览器的时区。在 Chrome 29 和 IE10 中,日期 + 时间似乎是正确的,但时区设置为浏览器的时区,这可能会导致问题...
2021-03-31 09:16:54
请注意,getUTCMonth() 返回值 0 到 11。因此,如果您需要按数字而不是字符串来表示月份,则对值进行 +1 会有所帮助。
2021-04-05 09:16:54
我喜欢你的想法,并做了一个我多次使用的方法。 function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
2021-04-08 09:16:54

toISOString()方法以简化的扩展 ISO 格式 ( ISO 8601 )返回一个字符串,其长度始终为 24 或 27 个字符(分别为YYYY-MM-DDTHH:mm:ss.sssZ±YYYYYY-MM-DDTHH:mm:ss.sssZ)。时区始终为零 UTC 偏移量,如后缀“ Z”所示。

来源: MDN 网络文档

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

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

var isoDateString = new Date().toISOString();
console.log(isoDateString);

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

@TheRebel,给出的用例是他需要向服务器发送一个格式化的字符串。
2021-03-11 09:16:54
@Will,你说得对,但是 - 就像这里的大多数观众一样 - 我是根据标题来到这里的,搜索一般 JS 日期到 UTC 的转换,所以我认为在这里提及它很有用:)
2021-03-22 09:16:54
@user1944491 我认为这不正确。根据 MDN 文档,toISOString确实正确转换为 UTC[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset同样在示例中,他们显示在调用 toISOString 时考虑了偏移量
2021-03-23 09:16:54
使用此方法时要小心!它不会创建 UTC 日期 - 它将现有日期数据按原样格式化为 UTC 格式并为其指定“Z”时区。这在 99% 的情况下都是错误的!在使用此方法之前,您必须将日期转换为 GMT 时区!
2021-03-26 09:16:54
实际上这会将日期对象转换为字符串,将无法对其进行进一步的日期操作
2021-04-03 09:16:54

这是我的方法:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

结果utc对象并不是真正的 UTC 日期,而是一个本地日期转移到匹配 UTC 时间(见评论)。然而,在实践中它可以完成工作。

这个答案展示了另一种常见的“纪元转移”实现,它孤立地是危险的,因为它可能会在 DST 转换等边缘情况下失败。不建议。
2021-03-14 09:16:54
添加 60000 * Date.getTimezoneOffset() 是不正确的!首先,您必须将所有日期/时间都视为带有时区修饰符的 UTC 以用于显示目的。浏览器可能有所不同,但是,Date.getTime() 返回自 1970-01-01 以来的毫秒数。如果您使用此数字创建新日期,例如: new Date(Date.getTime()); 它将是 UTC,但是当您显示它时(例如:通过 chrome 开发工具控制台),它将显示为您的本地时区。
2021-03-17 09:16:54
当我意识到Date.now()给出的是当地时间而不是 UTC 时间时,我正在研究这个问题,这个解决方案对我来说似乎是最简单的。至少在我想要 UNIX 时间而不是格式良好的字符串的情况下。(唯一的区别是我乘以60 * 1000只是为了更加清楚:))
2021-03-26 09:16:54
在我的浏览器中,这会创建一个不是 UTC 的 DateTime。但是,当在我的浏览器中显示时,这会在我的本地时区显示一个 DateTime,如果忽略时区信息,它将是正确的 UTC 时间。
2021-04-03 09:16:54
发现了,有趣的一点。让我们比较now.toString()utc.toString():有没有时区的变化,但时间的改变,这是完全不同的事情。然而,一个更干净的解决方案会更复杂(我猜是这样),只要不进一步处理时区,这段代码就可以在绝大多数情况下完成工作。这让我想起了打鸭子:不同的东西,但行为相同。还要注意 DrunkCoder 的代码也有同样的问题。
2021-04-08 09:16:54

在不更改日期/时间的情况下转换为 ISO

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

转换为 ISO 更改日期/时间(日期/时间将更改)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

小提琴链接

您不需要添加偏移量而不是减去它吗?参考stackoverflow.com/a/11964609/832230
2021-03-24 09:16:54
.toISOString() 简单直接,从中获取日期将是一个额外的步骤(isoDate 不是函数)。
2021-03-31 09:16:54
所以这是一种伪造的UTC?我改变了我的本地日期,我成功地向服务器提交了我在 PC 时钟上实际看到的日期和时间。哇。无论如何比 strinifying 和解析更好
2021-04-01 09:16:54
你也不需要 .toISOString(),你可以将 isoDate 发送到服务器
2021-04-07 09:16:54
@ABB 如果当前时区偏移量是 +ve,那么我们应该减去它(在我们的例子中 IST 是 +5:30),否则添加。
2021-04-08 09:16:54
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}
这很好用。您还可以将结果输入 jQuery $.parseDate(...) 以取回已转换为 UTC 的日期对象。
2021-03-21 09:16:54
这很好用。我只需要将源日期中的“-”替换为“/”以创建 JavaScript 日期,然后我就可以调用您的 toISO() 函数以获得正确的输出。
2021-04-03 09:16:54