如何将JavaScript日期转换为UTC?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将JavaScript日期转换为UTC?相关的知识,希望对你有一定的参考价值。

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

2009-1-1 to 2009-1-3

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

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

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

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

答案

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

资料来源:MDN web docs

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

这将使您能够做您需要的事情:

var isoDate = new Date('yourdatehere').toISOString();

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

另一答案

处理日期时我的建议是将日期解析为用户输入的各个字段。你可以将它用作一个完整的字符串,但你正在玩火。

JavaScript可以不同的格式处理不同格式的两个相同日期。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

永远不要做任何事情:

new Date('date as text');

将日期从用户输入解析为其各个字段后,创建日期对象。创建日期对象后,通过添加时区偏移将其转换为UTC。我不能强调由于DST而使用日期对象的偏移是多么重要(这是为了说明原因的另一个讨论)。

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

现在,您可以在UTC时间内将日期传递给服务器。我强烈建议不要使用任何日期字符串。将其传递给服务器,细分到您需要的最低粒度,例如:年,月,日,分或从unix时代开始的毫秒数值。

另一答案

如果你正在处理日期很多,那么值得使用moment.js(http://momentjs.com)。转换为UTC的方法是:

moment(yourTime).utc()

您可以使用格式将日期更改为您想要的任何格式:

moment(yourTime).utc().format("YYYY-MM-DD")

目前还有偏移选项,但还有一个额外的补充库来处理时区(http://momentjs.com/timezone/)。时间转换就像这样简单:

moment.tz(yourUTCTime, "America/New_York")
另一答案

转换为UTC并将其保留为日期对象的另一种解决方案:(它的工作原理是从格式化字符串的末尾删除'GMT'部分,然后将其放回Date构造函数中)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));
另一答案

我刚刚发现Steven Levithan的date.format.js的1.2.3版本正是我想要的。它允许您为JavaScript日期提供格式字符串,并将从本地时间转换为UTC。这是我现在使用的代码:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 
另一答案

我发现jQuery Globalization Plugin日期解析效果最好。其他方法有跨浏览器问题,像date.js这样的东西在很长一段时间内都没有更新。

您也不需要页面上的datePicker。您可以调用与文档中给出的示例类似的内容:

$.parseDate('yy-mm-dd', '2007-01-26');
另一答案

这个功能对我很有效。

function ParseDateForSave(dateValue) 
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();

另一答案

使用moment.js UTC method;

const moment = require('moment');
const utc = moment.utc(new Date(string));
另一答案

查看您的问题清楚地表明您只想将日期范围发送到后端进行进一步的后期处理。

我假设您符合标准数据准则,期望数据采用特定格式。例如,我使用ODATA,这是一个RESTfull API,它希望日期时间对象的格式为: -

YYYY-MM-DDT00:00:00。

这可以通过下面发布的代码段轻松实现(请根据您的要求更改格式)。

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

另一方面,如果您处于我从后端收到日期的情况,浏览器会将其转换为您当地的日期。另一方面,您对UTC日期感兴趣,那么您可以执行以下操作: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

上面的代码片段基本上添加/减去浏览器根据时区添加/减去的时间。

例如,如果我在EST(GMT-5)并且我的服务返回日期时间对象= 2016年8月17日星期三00:00:00 GMT-0500我的浏览器会自动减去时区偏移量(5小时)以获取当地时间。因此,如果我尝试获取时间,我将获得2016年8月16日星期三19:00:00 GMT-0500。这会导致很多问题。有很多库,这肯定会使这更容易,但我想分享纯JS方法。

欲了解更多信息,请查看:http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/在哪里获得灵感。

希望这可以帮助!

另一答案
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

这将为您提供正确的UTC日期和时间。 这是因为getTimezoneOffset()会在几分钟内给你时区差异。我建议你不要使用toISOString(),因为输出将在字符串中因此将来你将无法操纵日期

另一答案

这就是我过去所做的:

var utcDateString = new Date(new Date().toUTCString()).toISOString();
另一答案

简单而愚蠢

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);
另一答案

这个方法会给你:2017-08-04T11:15:00.000+04:30,你可以忽略区域变量来简单地得到2017-08-04T11:15:00.000

function getLocalIsoDateTime(dtString) 
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;

另一答案

我知道这个问题很老,但是看着同样的问题,一个选择是将date.valueOf()发送到服务器。 javascript日期的valueOf()函数发送自UTC时间1970年1月1日午夜以来的毫秒数。

valueOf()

另一答案

如果您需要Date Object

仅传递日期字符串日期假定时间按时区移动00:00:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

如果您添加当前的小时和分钟,您将获得正确的日期:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)