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

当我注意到在JavaScript中无法在时区操作方面原生做很多事情时,我感到很惊讶。

我稍微扩展了Date对象。这个函数有意义吗?基本上,每次我向服务器发送任何东西,它都将是一个用这个函数格式化的时间戳…

这里有什么主要问题吗?或者换个角度解决?

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

我只是觉得有点费解。我对表现也不是很确定。


当前回答

我想这就是你所期待的……

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

Now,

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

其他回答

只做:

const time = new Date().getTime();

MDN指出:

Date.prototype.getTime () 返回指定日期的数值,该数值为自1970年1月1日00:00:00 UTC以来的毫秒数。(之前的时间返回负值。)

编辑:下面的代码不工作。我总是假设new Date(). gettime()返回自1970年1月1日在当前时区的秒数。事实并非如此:getTime()返回UTC的秒数。因此,下面的代码会过度调整。谢谢大家!]

首先,感谢你的精彩见解。 我想我的问题标题错了……它应该是“获取现有日期的UTC Unix时间戳”。

如果我有一个date对象

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

我在寻找一个函数,它会告诉我“UTC Unix时间戳”。

这个函数似乎是真正的诀窍:

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

注意,它对“this”有效,这意味着我可以做:

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

n.getUTCUnixTime();

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

这有点疯狂,对我来说,Javascript在UTC时间存储所有东西,但为了得到这个数字,我必须创建一个新的Date对象,传递各个UTC getter,然后最后调用getTime()…

芝加哥商业交易所。

我想说明的是,new Date(). gettime()实际上返回一个UTC值,因此它是一种非常有用的存储和管理日期的方式,不受本地化时间的影响。

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

更多关于解释的信息在这里: 如果javascript "(new Date()). gettime()"从2个不同的时区运行。

我使用以下方法:

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

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

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

以这种方式构造的日期使用本地时区,使得构造的日期不正确。要设置某个日期对象的时区,就要从包含该时区的日期字符串构造它。(我在旧版Android浏览器上运行时遇到了问题。) 注意,getTime()返回毫秒,而不是普通的秒。

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

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

它将把当前时区偏移量考虑到结果中。对于字符串表示,David Ellis的答案是可行的。

澄清:

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

该输入被视为本地时间。如果传入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()返回星期几。