如何将JavaScriptdate转换为UTC?
假设您的网站用户inputdate范围。
2009-1-1 to 2009-1-3
您需要将此date发送到服务器进行一些处理,但服务器预计所有date和时间都是UTC。
现在假设用户在阿拉斯加或夏威夷或斐济。 由于它们的时区与UTC完全不同,因此date范围需要转换为如下所示:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
使用JavaScript Date对象,您将如何将第一个“本地化”date范围转换为服务器将理解的内容?
您需要的格式是使用.toISOString()
方法创build的。 对于本身不支持此方法的旧浏览器(ie8和以下版本),可以在此处find垫片:
这会让你有能力做你所需要的:
var isoDate = new Date('yourdatehere').toISOString();
对于时区的工作, moment.js和moment.js时区是非常宝贵的工具…特别是在客户端和服务器之间的时间导航javascript。
简单而愚蠢
var now = new Date(); var now_utc = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
这是我的方法:
var now = new Date(); var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
生成的utc
对象并不是真正的UTCdate,而是一个本地date,以匹配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而不更改date/时间
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
date/时间更改转换为ISO(date/时间将更改)
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
- 如果未提供参数,则构造函数根据系统设置为当前date和时间创build一个JavaScript Date对象。
- 注意:如果Date被调用为具有多个参数的构造函数,则指定的参数表示本地时间。 如果需要UTC,使用新的Date( Date.UTC(…) )具有相同的参数。 (注意:Date.UTC()返回自1970-01-01 00:00:00 UTC以来的毫秒数)
添加60000 * Date.getTimezoneOffset()作为以前的答案已经声明是不正确的。 首先,您必须将所有date/时间视为UTC时区,并带有时区修饰符用于显示。
再次,浏览器可能会有所不同,但是,Date.getTime()返回自1970-01-01 UTC / GMT以来的毫秒数。 如果你使用这个号码创build一个新的date,那么它将是UTC / GMT。 但是,如果通过调用.toString()来显示它,它将显示在您的本地时区中,因为.toString()使用您的本地时区,而不是它所调用的Date对象的时区。
我还发现,如果您在某个date调用.getTimezoneOffset(),它将返回您的本地时区,而不是您调用它的date对象的时区(但我不能validation这是标准的)。
在我的浏览器中,添加60000 * Date.getTimezoneOffset()会创build一个不是UTC的DateTime。 但是,当在我的浏览器(例如:.toString())中显示时,它会在我的本地时区中显示一个DateTime,如果忽略时区信息,则UTC时间是正确的。
var myDate = new Date(); // Set this to your date in whichever timezone. var utcDate = myDate.toUTCString();
你想把date转换成这样的string吗?
我会做一个function来做到这一点,虽然它有点争议,但将它添加到Date原型。 如果你不那么做,那么你可以把它作为一个独立的函数,把date作为parameter passing。
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”而不是用户的时区偏移量。
date = '2012-07-28'; stringdate = new Date(date).toISOString();
应该在大多数较新的浏览器中工作。 它将在Firefox 6.0上返回2012-07-28T00:00:00.000Z
我使用date时的build议是将用户input中的dateparsing为单个字段。 你可以使用它作为一个完整的string,但你玩火。
JavaScript可以以不同的格式处理两个相同的date。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
千万不要做任何事情:
new Date('date as text');
将用户input的dateparsing为单个字段后,创build一个date对象。 创builddate对象后,通过添加时区偏移量将其转换为UTC。 我不能强调使用DST中的date对象的偏移量是多么重要(然而,这是另一个讨论,以显示为什么)。
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);
现在您可以将date以UTC时间传递给服务器。 我再次强烈build议不要使用任何datestring。 可以将它传递给服务器,细分为您需要的最小粒度,例如年,月,日,分钟或从unix时期开始的毫秒值。
我刚刚发现Steven Levithan的1.2.3版本的date.format.js正是我想要的。 它允许您提供JavaScriptdate的格式string,并将从本地时间转换为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全球化插件dateparsing工作最好。 其他方法有跨浏览器的问题,像date.js的东西在一段时间内没有更新。
你也不需要在页面上的dateselect器。 你可以调用类似于文档中给出的例子:
$.parseDate('yy-mm-dd', '2007-01-26');
这个function对我来说很好用。
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(); }
如果你处理的date很多,值得使用moment.js( http://momentjs.com )。 转换为UTC的方法是:
moment(yourTime).utc()
您可以使用格式将您的date更改为任何您想要的格式:
moment(yourTime).utc().format("YYYY-MM-DD")
目前还有偏移选项,但是还有一个额外的补充库用于处理时区( http://momentjs.com/timezone/ )。 时间转换将如此简单:
moment.tz(yourUTCTime, "America/New_York")
另一个解决scheme转换为UTC并将其保留为date对象:(它通过从格式化的string的末尾删除'GMT'部分,然后将其放回到Date构造函数)
var now = new Date(); var now_utc = new Date(now.toUTCString().slice(0, -4));
看看你的问题清楚,你只是想发送date范围到后端进一步后处理。
我假设你符合标准的数据准则,期望数据是在一个特定的格式。 例如,我使用ODATA,这是一个RESTfull API,期望date时间对象的格式为: –
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";
另一方面,如果您处于您从后端收到date的情况,并且浏览器会将其转换为当地date。 另一方面,您对UTCdate感兴趣,那么您可以执行以下操作: –
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);
上面的代码片段基本上是根据时区来添加/减去浏览器添加/减去的时间。
例如,如果我在东部时间(格林尼治标准时间-5),我的服务返回date时间对象= Wed Aug 17 2016 00:00:00 GMT-0500我的浏览器会自动减去时区偏移量(5小时)来获取我的本地时间。 所以,如果我想取得时间,我会得到周三8月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)));
这会给你适当的UTCdate和时间。
这是因为getTimezoneOffset()
会以分钟为getTimezoneOffset()
给你时区差异。 我build议你不要使用toISOString()
因为输出将在string中,因此在将来你将无法操作date
我知道这个问题是旧的,但看着这个相同的问题,一个select是将date.valueOf()发送到服务器。 javascript Date的valueOf()函数发送自UTC 1970年1月1日午夜以来的毫秒数。
的价值()
构造函数从unix-epoch开始返回毫秒数。 所有这些代表UTC:
(node.js v8.0)
var now = new Date(); console.log(now.getTime()); console.log((now - now.getTimezoneOffset())); var utcDate = new Date(new Date().getTime()); console.log(utcDate.getTime());
打印:
1496675469925 1496675470045 1496675469950
这就是我过去所做的:
var utcDateString = new Date(new Date().toUTCString()).toISOString();
这种方法会给你: 2017-08-04T11:15:00.000+04:30
,你可以忽略区域variables来简单地得到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; }
以UTC获取Date的最简单方法之一是:
new Date(new Date().toISOString().split('.')[0])
更简单
myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);