如何在JavaScript中获得UTC时间戳?

在编写Web应用程序时,将(服务器端) 所有date时间作为UTC时间戳存储在DB中是有意义的。

当我注意到在JavaScript中的时区操作方面,你本来就不能做很多事情时,我感到非常惊讶。

我稍微扩展了Date对象。 这个function有意义吗? 基本上,每次我发送任何东西到服务器,这将是一个时间戳格式与此function…

你能看到这里有什么大问题吗? 或者从不同的angular度解决?

Date.prototype.getUTCTime = function(){ return new Date( this.getUTCFullYear(), this.getUTCMonth(), this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds() ).getTime(); } 

这对我来说似乎有些复杂。 而且我也不太确定performance。

  1. 以这种方式构build的date使用当地时区,使构build的date不正确。 设置某个date对象的时区是从包含时区的datestring构造它。 (我在使用旧版Android浏览器时遇到问题。)

  2. 请注意, getTime()返回毫秒,而不是简单的秒。

对于UTC / Unix时间戳,以下就足够了:

 Math.floor((new Date()).getTime() / 1000) 

它会将当前的时区偏移量分解到结果中。 对于string表示, David Ellis的回答是有效的。

澄清:

 new Date(Y, M, D, h, m, s) 

该input被视为当地时间 。 如果通过UTC时间 ,结果将会有所不同。 观察(我现在在GMT +02:00,现在是07:50):

 > var d1 = new Date(); > d1.toUTCString(); "Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time > Math.floor(d1.getTime()/ 1000) 1332049834 > var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() ); > d2.toUTCString(); "Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0! > Math.floor(d2.getTime()/ 1000) 1332042634 

另请注意, getUTCDate()不能替代getUTCDay() 。 这是因为getUTCDate()返回月份的一天 ; 而getUTCDay()返回星期几

你也可以使用getTimezoneOffset和getTime,

 x = new Date() var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000; 

是的,你不需要那么做; 假设我正确地理解了你,你只需要toUTCString方法 。

 var UTCstring = (new Date()).toUTCString(); 

但是,请记住,您得到的date值取决于客户机器的时钟,而不是服务器。 如果你需要这些date的精确值(例如,当这个或那个动作相对于另一个用户的动作完成时,要正确地sorting),不pipe怎样,你不能依赖客户端的date库,并且你需要计算根据客户与您联系的时间在服务器端进行date。

还要记住,基本上所有的客户端代码都可以被客户端修改,并且恶意的值被返回,你只能保证服务器端的代码 – 把客户端看作是一个可能的攻击者。

实际上,我认为js中的Date值比C#DateTime对象要好得多。 C#DateTime对象有一个Kind属性,但没有严格的底层时区,如果在两个非UTC和非本地时间之间进行转换,则时区转换很难跟踪。 在js中,所有的Date值都有一个潜在的UTC值,它被传递并且知道,而不pipe你做的是什么时间转换。 我对Date对象最大的抱怨就是浏览器实现者select包含的未定义行为的数量,这可能会让那些在js中攻击date的人与试验和错误混淆,而不是阅读规范。 使用类似iso8601.js的东西,通过定义Date对象的单个实现来解决这个变化的行为。

默认情况下,规范说你可以使用扩展的ISO 8601date格式创builddate

 var someDate = new Date('2010-12-12T12:00Z'); 

所以你可以用这种方式来推断确切的UTC时间。

当你想将date值传递回服务器时,你会打电话

 someDate.toISOString(); 

或者如果您宁愿使用毫秒时间戳(从1970年1月1日UTC开始的毫秒数)

 someDate.getTime(); 

ISO 8601是一个标准。 如果包含date偏移量,则不能对datestring意味着什么。 这对于开发者来说意味着什么,你不需要自己处理本地时间转换 。 本地时间值纯粹是为了用户的利益而存在的,date值默认显示在当地时间。 所有的本地时间操作允许你显示一些合理的用户,并从用户input转换string。 尽可能快地转换为UTC是一个很好的习惯,而js Date对象使得这个相当平凡。

缺点是没有太多的时间来强迫客户端(我知道)的时区或区域设置,这可能是烦人的网站特定的设置,但我猜这背后的原因是,它是一个用户不应该触及的configuration。

所以,简而言之,时区操作的原生支持并不多,原因是你根本就不想这样做。

您通常不需要在客户端执行很多“时区操作”。 作为一个规则,我尝试存储和使用UTCdate,以ticks或“ 自1970年1月1日午夜以来的毫秒数 ”forms。 这实际上简化了存储,sorting和偏移计算,最重要的是,摆脱了“夏令时”调整的头痛之苦。 这里有一个我使用的JavaScript代码。

获取当前UTC时间:

 function getCurrentTimeUTC() { //RETURN: // = number of milliseconds between current UTC time and midnight of January 1, 1970 var tmLoc = new Date(); //The offset is in minutes -- convert it to ms return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000; } 

那么你通常需要格式化最终用户的当地时区和格式的date/时间。 以下处理客户端计算机上所有date和时间格式的复杂性:

 function formatDateTimeFromTicks(nTicks) { //'nTicks' = number of milliseconds since midnight of January 1, 1970 //RETURN: // = Formatted date/time return new Date(nTicks).toLocaleString(); } function formatDateFromTicks(nTicks) { //'nTicks' = number of milliseconds since midnight of January 1, 1970 //RETURN: // = Formatted date return new Date(nTicks).toLocaleDateString(); } function formatTimeFromTicks(nTicks) { //'nTicks' = number of milliseconds since midnight of January 1, 1970 //RETURN: // = Formatted time return new Date(nTicks).toLocaleTimeString(); } 

所以下面的例子:

 var ticks = getCurrentTimeUTC(); //Or get it from the server var __s = "ticks=" + ticks + ", DateTime=" + formatDateTimeFromTicks(ticks) + ", Date=" + formatDateFromTicks(ticks) + ", Time=" + formatTimeFromTicks(ticks); document.write("<span>" + __s + "</span>"); 

返回以下内容(用于我的美国英语区域设置):

ticks = 1409103400661,DateTime = 8/26/2014 6:36:40 PM,Date = 8/26/2014,Time = 6:36:40 PM

以传统格式获取UTC时间最简单的方法如下:

 new Date().toISOString() "2016-06-03T23:15:33.008Z" 

我使用以下内容:

 Date.prototype.getUTCTime = function(){ return this.getTime()-(this.getTimezoneOffset()*60000); }; 

一旦定义了这个方法,你可以做:

 var utcTime = new Date().getUTCTime(); 

如果你想要一个class轮 ,可以用JavaScript创buildUTC Unix时间戳

 var currentUnixTimestap = ~~(+new Date() / 1000); 

这将考虑系统的时区。 自从时代以来,这基本上是时间stream逝了。

怎么运行的:

  • 创builddate对象: new Date()
  • 通过在创build对象之前添加unary +timestamp integer转换为timestamp integer 。 : +new Date()
  • 将毫秒转换为秒: +new Date() / 1000
  • 使用双重折叠将四舍五入的值整数。 : ~~(+new Date())

编辑:下面的代码不起作用。 我总是假设新的Date()。getTime()返回自1970年1月1日起在当前时区以来的秒数。 情况并非如此:getTime()返回UTC中的秒数。 所以,下面的代码总是过度调整。 谢谢大家!]

首先,感谢您的精彩见解。 我想我的问题有错误的标题…它应该是“获取一个现有的dateUTC UTC时间戳”。

所以,如果我有一个date对象:

 var d = new Date(2009,01,31) 

我后来的一个函数会告诉我“UTC Unix时间戳”。

这个function似乎是真正的诀窍:

 Date.prototype.getUTCUnixTime = function (){ return Math.floor( new Date( this.getUTCFullYear(), this.getUTCMonth(), this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds() ).getTime() / 1000); } 

请注意,它适用于“这”这意味着我可以这样做:

 var n = new Date(2008,10,10) ... ... n.getUTCUnixTime(); 

在Unix时间内获得1970年1月1日以来的秒数。 对?

对我来说,Javascript有点疯狂,JavaScript以UTC时间存储所有内容,但为了获得这个数字,我必须创build一个新的Date对象,传递个别的UTC getters,然后最后调用getTime()。

芝加哥商业交易所。

我对这个问题变得多么复杂感到惊讶。

这些都是完全相同的,它们的整数值全部=== EPOCH时间:D

 console.log((new Date()).getTime() / 1000, new Date().valueOf() / 1000, (new Date() - new Date().getTimezoneOffset() * 60 * 1000) / 1000); 

不要相信我,结帐: http : //www.epochconverter.com/

我想清楚地表明,新的Date().getTime()实际上会返回一个UTC值,所以这是一个非常有用的方式来存储和pipe理date的方式是不可知的本地化时间。

换句话说,不要打扰所有UTC的JavaScript函数。 相反,只需使用Date.getTime()。

更多的信息在这里解释: 如果javascript“(new Date())。getTime()”从2个不同的时区运行。

我认为这是一个更好的解决scheme

 // UTC milliseconds new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime() // UTC seconds new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0 

这将以UTC返回时间戳:

 var utc = new Date(new Date().toUTCString()).getTime(); 

我想这是你所期望的…

 var currTimestamp = Date.now(), //1482905176396 utcDateString = (new Date(currTimestamp)).toUTCString(); //"Wed, 28 Dec 2016 06:06:50 GMT" 

现在,

 new Date(utcDateString).getTime(); //This will give you UTC Timestamp in JavaScript 

由于new Date().toUTCString()返回一个像"Wed, 11 Oct 2017 09:24:41 GMT"这样的string"Wed, 11 Oct 2017 09:24:41 GMT"可以对最后3个字符进行切片并将切片的string传递给new Date()

 new Date() // Wed Oct 11 2017 11:34:33 GMT+0200 (CEST) new Date(new Date().toUTCString().slice(0, -3)) // Wed Oct 11 2017 09:34:33 GMT+0200 (CEST)