JavaScript日期,setFullYear更改时区

时间:2018-09-20 06:39:07

标签: javascript datetime ecmascript-6

JavaScript日期与时区一起使用。如果我创建一个日期,它将设置时区。当我更新该日期的年份时,我不希望时区发生变化。但是,确实如此。最糟糕的是,它更改时区而不更改时间,从而导致实际时间偏移一小时!

这会导致以下问题:如果我知道某人的生日,并且想知道他今年的生日,我不能简单地使用birthdate.setFullYear(2018)将年份设置为当前年份,因为它将返回生日减去1。小时。这意味着它发生在实际生日的前一天,晚上11点。

let test = new Date('1990-10-20');
console.log(test);
console.log(test.toISOString().substring(0, 10));

// 1990-10-20 ( Sat Oct 20 1990 01:00:00 GMT+0100 (Central European Standard Time) )

test.setFullYear(2000);
console.log(test);
console.log(test.toISOString().substring(0, 10));

// 2000-10-19 ( Fri Oct 20 2000 01:00:00 GMT+0200 (Central European Summer Time) === one hour too soon!! )

可能不是您的时区重现,这是我的输出:

  

“ 1990-10-20T00:00:00.000Z”

     

1990-10-20

     

“ 2000-10-19T23:00:00.000Z”

     

2000-10-19

我发现的唯一解决方法是用字符串对日期进行替换并将其替换为字符串值。如何使用Date对象做得更好?

2 个答案:

答案 0 :(得分:2)

嗯,也许最好改用setUTCFullYear(...)MDN Docs)吗?至少在那种情况下,不会浪费时间。

let test = new Date('1990-10-20');
console.log(test);
console.log(test.toISOString().substring(0, 10));

// "1990-10-20T00:00:00.000Z")

test.setUTCFullYear(2000);
console.log(test);
console.log(test.toISOString().substring(0, 10));

// "2000-10-20T00:00:00.000Z"

答案 1 :(得分:0)

BEWARE THE TIMEZONE 如果您想使用日期对象来处理日期(或多或少必须这样做),则日期对象应在开始时代表UTC午夜有关日期。对于您的情况,要表示年份,请在1月1日开始使用UTC午夜。这是一个常见且必要的约定,但是您需要引起很多注意,以确保时区不会如您所发现的那样变回原来的时间。

当您说“ javascript日期与时区一起使用”时,javascript日期是一个时间点(自纪元以来的滴答声),带有方便的静态函数,可将该时间点转换为本地时区(或指定时区)中的有意义的字符串。日期对象本身没有时区属性。

因此,您可以使用类似...的方法创建UTC午夜年份。

var myDate = new Date(Date.UTC(2018,0,1)); // months are zero-indexed !

然后序列化它并指定UTC ...

myDate.toISOString();
myDate.toLocaleDateString("en",{timezone:"UTC"});