在编写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();
}
我只是觉得有点费解。我对表现也不是很确定。
以这种方式构造的日期使用本地时区,使得构造的日期不正确。要设置某个日期对象的时区,就要从包含该时区的日期字符串构造它。(我在旧版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()返回星期几。
您通常不需要在客户端做太多的“时区操作”。作为一项规则,我尝试以刻度或“自1970年1月1日午夜以来的毫秒数”的形式存储和使用UTC日期。这确实简化了存储、排序和偏移量的计算,最重要的是,使您摆脱了“日光节约时间”调整的麻烦。下面是我使用的一小段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;
}
然后,通常需要为最终用户按照他们的本地时区和格式格式化日期/时间。下面的代码处理了客户端计算机上所有复杂的日期和时间格式:
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>");
返回以下内容(对于我的美国英语地区):
蜱=1409103400661,日期时间=8/26/2014下午6:36:40,日期=8/26/2014,
时间= 6:36:40点