JavaScript Date toLocaleTimeString()的行为不符合预期

时间:2015-02-26 13:24:05

标签: javascript localization

我在页面上有两个计时器。一个显示本地时间,另一个显示从零开始的定时器。

function go()
{
    startTime = Date.now();
    setInterval( updateTime, 1000);
}     

function updateTime() {
    var now = new Date();              
    sessionTime = new Date(Date.now() - startTime);      

    $("#session").text(checkTime(sessionTime.getHours()) + ":" +
        checkTime(sessionTime.getMinutes()) + ":" +
        checkTime(sessionTime.getSeconds()));


    $("#timer").text(checkTime(now.getHours()) + ":" + 
        checkTime(now.getMinutes()) + ":" + 
        checkTime(now.getSeconds())); 
};

function checkTime(i) {
    if (i <10) {
        i = "0" + i;
    }
    return i;
}

不幸的是,元素#sessionLocale会返回01:00:00而不是我期待的00:00:00

我从'now'时间删除了startTime。然后我用它来提取小时,分钟和秒,这给了我00:00:00。但如果我使用toLocaleTimeString,我会得到01:00:00。

我想使用toLocaleTimeString来获取它的本地化选项。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这是有效的

function go()
{
    startTime = Date.now();
    setInterval( updateTime, 1000);
}     

function updateTime() {
    var now = new Date();              
    sessionTime = new Date(Date.now() - startTime);

    // sessionTime.setHours(00);
    console.log();
    sessionTimeL = new Date(Date.now() - startTime);

    $("#session").text(checkTime(sessionTime.getUTCHours()) + ":" +
        checkTime(sessionTime.getUTCMinutes()) + ":" +
        checkTime(sessionTime.getUTCSeconds()));
    $("#sessionLocale").text(
      pad(Math.floor(sessionTimeL * 1 / (1000 * 60 * 60) % 24), 2) + ':' +
      pad(Math.floor(sessionTimeL * 1 / (1000 * 60) % 60), 2) + ':' +
      pad(Math.floor(sessionTimeL * 1 / (1000) % 60), 2)
    );

    $("#timer").text(checkTime(now.getHours()) + ":" + 
        checkTime(now.getMinutes()) + ":" + 
        checkTime(now.getSeconds())); 

    console.log(sessionTime.toLocaleTimeString('en-US', {
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
    }));
}

function checkTime(i) {
    if (i <10) {
        i = "0" + i;
    }
    return i;
}

function pad(n, width, z) {
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

go();
<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-2.1.1.min.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div id="session"></div>
  <div id="sessionLocale"></div>
  <div id="timer"></div>
</body>
</html>

所以这就是原因。您正在创建一个新的日期,0毫秒女巫等于1970 - 01 - 01 00:00:00 UTC,所以当你在不同的时区,然后UTC你得到偏移。

您可以计算时差,也可以使用date.getUTCHours()获取UTC时数。或者你得到UTC字符串和正则表达式的时间。我所做的解决方案更安全。

答案 1 :(得分:0)

由于不同地区的偏移量变化,有时候在Javascript上使用日期会很麻烦。

有一个名为DataJS的库,它非常易于实现,具有非常出色的性能,并且可以扩展Date方法,添加您可能需要自己实现的功能。

例如,要获得两个日期之间的差异:

var futureDate = new Date().add({months: 5, days: 4, hours: 3, minutes: 2, seconds: 1}); 

var now = new Date();

var timeSpan = new TimeSpan(futureDate - now);

console.log("Days:", timeSpan.getDays()); console.log("Hours:", timeSpan.getHours()); console.log("Minutes:", timeSpan.getMinutes()); console.log("Seconds:", timeSpan.getSeconds());

通过这种方式,您可以在两个日期之间获得更加人性化的时间跨度。

https://code.google.com/p/datejs/source/browse/trunk/处查看SVN中的最新版本。