我们在12月份获得了一小时(夏令时)

时间:2014-03-03 07:51:03

标签: javascript datetime timezone

我制作了一个小代码段。告诉你你多大了,到第二个。

但我发现了一些奇怪的东西。我知道时间和时区是一个噩梦,但这是在我自己的国家和时区内,所以我有点困惑。

如果我输入日期。 2013年12月27日(dd-MM-yyyy),它将显示:

Right time

哪个是对的。这时的时间是:08:42。 getTimezoneOffset() is -60

但如果我回去一天会显示出来:

Wrong time

它增加了一个小时!?这是它发生的唯一日期,我有点困惑,因为夏令时只适用于春季和秋季。 getTimezoneOffset() is ALSO -60

希望你能对此有所了解。

时区http://www.timezoneconverter.com/cgi-bin/zoneinfo?s=standard&tz=Europe/Copenhagen Javascript :GMT + 0100(浪漫标准时间)
国家:丹麦 JSFiddle http://jsfiddle.net/d6kBJ/4/

var $output = $(".js-ageoutput");
var bd = new Date(2000, 0, 01);
bd.setHours(0);
bd.setMinutes(0);
bd.setSeconds(0);

function showTotalAge() {
    var ageDifMs = Date.now() - bd.getTime();
    var ageDate = new Date(ageDifMs); // miliseconds from epoch
    displayAge(ageDate)
    loopAge();
}

function displayAge(age) {
    var yearOld = Math.abs(age.getFullYear() - 1970);
    var months = age.getMonth();
    var days = age.getDate() - 1;
    var h = age.getHours() - 1;
    var m = age.getMinutes();
    var s = age.getSeconds();
    $output.html(yearOld + ' years <br/>' + months + ' months <br/>' + days + ' days <br/>' + h + 'hours <br/>' + m + ' minutes <br/>' + s + ' seconds<br/>');
}

function loopAge() {
    setTimeout(showTotalAge, 1000);
}
loopAge();

$(".js-birthday").change(function () {
    var vArr = $(this).val().split('-');
    bd = new Date(vArr[0], parseInt(vArr[1], 10) - 1, vArr[2]);
    bd.setHours(0);
    bd.setMinutes(0);
    bd.setSeconds(0);
    console.log(bd);
});

1 个答案:

答案 0 :(得分:3)

在深入检查您的代码后,这是您的错误:

var ageDate = new Date(ageDifMs);

重点是:永远不会根据日期差异创建一个Date对象,因为它没有任何意义。你得到的是一个Date对象,代表1970年1月1日UTC之后的ageDifMs毫秒,这就是getMonthgetDategetHours等方法等等。参考。

所以,你有一个像1970年3月28日这样的日期,那就是夏令时发生的时间。

如果您想知道两个日期在月份和日期等方面的差异,您可以计算getMonth和其他方法的结果差异,或者确定一年的长度,一个月,使用模数和除法计算单个值。

此外,您宁愿使用setInterval代替setTimeout进行定时连续任务。