如何将 JavaScript 日期转换为 UTC?
-
09-09-2019 - |
题
假设您网站的用户输入一个日期范围。
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 网络文档
您需要的格式是用以下命令创建的 .toISOString()
方法。对于较旧的浏览器(ie8及以下),本身不支持此方法,可以找到垫片 这里:
这将使您能够执行您需要的操作:
var isoDate = new Date('yourdatehere').toISOString();
对于时区工作, moment.js 和 moment.js 时区 确实是非常宝贵的工具...特别是对于在客户端和服务器 javascript 之间导航时区。
其他提示
简单和笨
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);
这是我的方法:
var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
将所得utc
对象是不是一个真正的UTC日期,但一个本地日期偏移以匹配UTC时间(见注释)。然而,在实践中它的工作。
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(':');
}
<强>转换为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
浏览器可能有所不同,您还应该记住不要信任客户端生成的任何信息,也就是说,以下声明对我有效(Mac OS X 10.8.2 上的 Google Chrome v24)
var utcDate = new Date(new Date().getTime());
编辑:“这和刚才有什么不同 new Date()
?“ 看这里: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
- 如果未提供参数,构造函数将根据系统设置创建当前日期和时间的 JavaScript Date 对象。
- 笔记:当 Date 被作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要 UTC,请使用 new 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() 创建一个 DateTime 不是世界标准时间. 。但是,当在我的浏览器中显示时(例如:.toString() ),它会在我的本地时区中显示一个 DateTime,如果忽略时区信息,该日期时间将是正确的 UTC 时间。
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
您想将日期转换成这样一个字符串?
我会做一个函数来做到这一点,而且,尽管它是稍有争议,将其添加到日期原型。如果你不舒服这样做,那么你可以把它作为一个独立的函数,将日期作为参数。
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
;
};
getUTCFullYear,getUTCMonth,getUTCHours ...然后只需添加:如果你需要它在UTC时间,刚好与getUTC *,如更换所有的get *函数“+00:00”结尾,而不是用户的时区偏移量。
date = '2012-07-28'; stringdate = new Date(date).toISOString();
应在最新的浏览器工作。它在Firefox 6.0返回2012-07-28T00:00:00.000Z
我的使用日期时的建议是解析日期到从用户输入的各个字段。你可以使用它作为一个完整的字符串,但你是在玩火。
JavaScript可以以不同的格式不同地对待两个相等的日期。
HTTPS://developer.mozilla。组织/ EN-US /文档/网络/的JavaScript /参考/ Global_Objects /日期/解析
决不做像什么:
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 /时区/ )。时间转换将是像这样简单:
moment.tz(yourUTCTime, "America/New_York")
另一种解决方案,以转换为UTC和保持它作为一个日期对象: (它通过从所述格式化的字符串的末尾去除“GMT”部分,然后把它放回Date构造)
var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));
我需要做这与日期时间选择器库接口。但总的来说这是一个坏主意,使用日期这种方式工作。
用户普遍希望在当地的时间与日期时间的工作,让你无论是更新服务器端代码正确解析与偏移日期时间字符串,然后转换为UTC(最好的选择),或者你之前转换为UTC字符串客户端(在威尔斯特恩的回答等)发送到所述服务器
我刚刚发现1.2.3版本的史蒂芬Levithan的 date.format.js 不正是我想要的。它可以让你提供一个格式字符串为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插件全球化日期解析效果最好。其他方法有跨浏览器问题和类似的东西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方法;
const moment = require('moment');
const utc = moment.utc(new Date(string));
这是我在过去所做的那样:
var utcDateString = new Date(new Date().toUTCString()).toISOString();
查看您的问题,很明显您只想将日期范围发送到后端以进行进一步的后处理。
我假设您遵守标准数据指南,该指南期望数据采用特定格式。例如,我使用 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) 中,并且我的服务返回日期时间对象 = Wed Aug 17, 2016 00:00:00 GMT-0500 我的浏览器会自动减去时区偏移量(5小时)来获取我的当地时间。因此,如果我尝试获取时间,我会得到 Wed Aug 16 2016 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()
因为输出将在字符串中因此,在未来您将无法操纵日期
这个方法会给你: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对象
仅传递日期字符串日期假定时间是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)
使用瞬间包,您可以轻松地转换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日期在服务器和拿回来作为一个新的Date对象。上面的代码工作为我类似的问题,这个线程是的要求。这里共享,以便它可以帮助别人。我看不出究竟上述任何答案的解决方案。感谢。
我知道这个问题是旧的,但在看这个相同的问题,其中一个方案是发送date.valueOf()到服务器,而不是。的JavaScript日期的的valueOf()函数发送自午夜的毫秒数1970年1月1 UTC。
所以这是我不得不这样做,因为我还是想一个JavaScript日期对象来操作的日期和unfortunantly很多的这些问题的答案需要你去到一个字符串的方式。
//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)
//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that
var correctDate = new Date(newDate.setUTCHours(0))
//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability
甚至更简单的结果
myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);