Javascript日期,setFullYear更改时区

Javascript日期,setFullYear更改时区,javascript,datetime,ecmascript-6,Javascript,Datetime,Ecmascript 6,Javascript日期与时区一起工作。如果我创建一个日期,它会设置时区。当我更新该日期的年份时,我不希望时区改变。然而,确实如此。最糟糕的是,它改变了时区而不是时间,导致实际时间改变了一个小时 这导致了一个问题,即如果我有此人的出生日期,并且想知道他今年的生日,我不能简单地使用birthdate.setFullYear(2018)将年份设置为当前年份,因为它将返回减去一小时的生日。这意味着它发生在实际生日的前一天,11点钟 let test=新日期('1990-10-20'); 控制台日志(

Javascript日期与时区一起工作。如果我创建一个日期,它会设置时区。当我更新该日期的年份时,我不希望时区改变。然而,确实如此。最糟糕的是,它改变了时区而不是时间,导致实际时间改变了一个小时

这导致了一个问题,即如果我有此人的出生日期,并且想知道他今年的生日,我不能简单地使用
birthdate.setFullYear(2018)
将年份设置为当前年份,因为它将返回减去一小时的生日。这意味着它发生在实际生日的前一天,11点钟

let test=新日期('1990-10-20');
控制台日志(测试);
log(test.toISOString().substring(0,10));
//1990年10月20日(星期六1990年10月20日01:00:00GMT+0100(中欧标准时间))
测试。整年(2000年);
控制台日志(测试);
log(test.toISOString().substring(0,10));

//2000年10月19日(星期五2000年10月20日01:00:00GMT+0200(中欧夏季时间)==太早了一个小时!!)
Hm,也许用
setUTCFullYear(…)
()代替会更好?至少在这种情况下,它不会扰乱时间

let test=新日期('1990-10-20');
控制台日志(测试);
log(test.toISOString().substring(0,10));
//“1990-10-20T00:00:00.000Z”)
测试。设置完整年份(2000年);
控制台日志(测试);
log(test.toISOString().substring(0,10));

//“2000-10-20T00:00:00.000Z”
Hm,也许使用
setUTCFullYear(…)
()更好?至少在这种情况下,它不会扰乱时间

let test=新日期('1990-10-20');
控制台日志(测试);
log(test.toISOString().substring(0,10));
//“1990-10-20T00:00:00.000Z”)
测试。设置完整年份(2000年);
控制台日志(测试);
log(test.toISOString().substring(0,10));
//“2000-10-20T00:00:00.000Z”
如果您想使用日期对象(您或多或少必须这样做),您的日期对象应该在相关日期开始时表示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"});
如果您想使用日期对象处理一个日期(您或多或少必须这样做),您的日期对象应该在相关日期开始时表示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"});

时区真的是这里的问题吗?我测试了你的代码,没问题。我认为这更像是夏令时的问题。作为UTC,时间是一样的,对吗?啊,我明白,反过来说:在当地时间,时间实际上保持不变。见拉米兹的回答。我只是想用UTC显示日期时间。因为saylight节电问题,情况就不一样了。这似乎是特定于浏览器的-我在Chrome中看到了问题,但Firefox、Edge和IE显示“2000-10-20T00:00:00.000Z”时区真的是问题所在吗?我测试了你的代码,没问题。我认为这更像是夏令时的问题。作为UTC,时间是一样的,对吗?啊,我明白,反过来说:在当地时间,时间实际上保持不变。见拉米兹的回答。我只是想用UTC显示日期时间。由于saylight节电问题,情况就不一样了。这似乎是特定于浏览器的-我在Chrome中看到了问题,但Firefox、Edge和IE显示的“2000-10-20T00:00:00.000Z”确实解决了我的问题。阅读说明书,似乎浏览器实际上应该将时间片段设置为UTC,这导致了这一点,我从来没有想到夏时制在当时是不同的。谢谢!这确实解决了我的问题。阅读说明书,似乎浏览器实际上应该将时间片段设置为UTC,这导致了这一点,我从来没有想到夏时制在当时是不同的。谢谢!