如何在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。
-
以这种方式构build的date使用当地时区,使构build的date不正确。 设置某个date对象的时区是从包含时区的datestring构造它。 (我在使用旧版Android浏览器时遇到问题。)
-
请注意,
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)