Javascript 发生精确日光切换时,新日期()未按预期工作

Javascript 发生精确日光切换时,新日期()未按预期工作,javascript,angular,typescript,Javascript,Angular,Typescript,我有一个场景,需要将“年、月、日期、时间”传递到date()函数并获取datetime类型 使用铬 Windows已配置EST时区(-05:00) DST于2020年3月8日凌晨2点开始(美国东部夏令时-04:00) 如果我将日期时间传递为日期(2020,02,08,01),则返回为“Sun Mar 08 2020 01:00:00 GMT-0500(东部标准时间)” 但当我超过凌晨2点(dst切换的确切位置)的日期时间时,它返回为“Sun Mar 08 2020 03:00:00 GMT-04

我有一个场景,需要将“年、月、日期、时间”传递到date()函数并获取datetime类型

  • 使用铬
  • Windows已配置EST时区(-05:00)
  • DST于2020年3月8日凌晨2点开始(美国东部夏令时-04:00)
  • 如果我将日期时间传递为日期(2020,02,08,01),则返回为“Sun Mar 08 2020 01:00:00 GMT-0500(东部标准时间)”

    但当我超过凌晨2点(dst切换的确切位置)的日期时间时,它返回为“Sun Mar 08 2020 03:00:00 GMT-0400(东部夏时制)”

    它的返回时间为“03”而不是“02”


    有人能告诉我为什么日期功能在特定时间无法正常工作,以及如何解决此问题吗?

    我们在3月29日进行了DST-在GMT-1/GMT-2中按预期工作

    console.log(新日期(2020,2,29,0,0,0,0));//在CEST中我得到“2020-03-28 23:00:00.000Z”
    log(新日期(2020,2,29,1,0,0,0))//在CEST中我得到“2020-03-29T00:00:00.000Z”
    console.log(新日期(2020,2,29,2,0,0))//在CEST中我得到“2020-03-29T01:00:00.000Z”
    log(新日期(2020,2,29,3,0,0,0))//在CEDT中我得到“2020-03-29T01:00:00.000Z”!!!
    console.log(新日期(2020,2,29,4,0,0,0))//在CEDT中我得到“2020-03-29T02:00:00.000Z”
    结果是正确的

    Date(2020,02,08,01,59,00) returns Sun Mar 08 2020 01:59:00 GMT-0500
    Date(2020,02,08,02,00,00) returns Sun Mar 08 2020 03:00:00 GMT-0400
    
    春天,时钟向前跳一小时。注意到GMT的偏移量是如何减少一小时的吗?那是东海岸的夏令时

    3月8日没有凌晨2点(GMT-05),至少东部时区没有。格林尼治时间01:59:59-05:00一秒钟后,时钟跳至格林尼治时间03:00:00-04:00。这种跳跃反映在GMT中,它实际上是GMT的一个偏移量

    下面的内容是:当您创建一个新的日期时,Javascript解析它,并在内部存储1970年1月1日GMT00:00(纪元,格林威治标准时间)之后的精确时间。当您现在尝试从这个内部值获取诸如年、月、日、小时之类的信息时,Javascript应用您的本地时区来确定它应该返回的本地时间。因此,当您从日期(2020,02,08,02,00,00)创建日期对象时,JS假定这仍然是标准(冬季)时间,因为夏令时中没有凌晨2点。滴答声中的值与03:00:00 GMT-00:40相同,当您打印或以其他方式访问此日期的小时值时,Javascript会将其定位到您的时区。但同样,02:00:00 GMT-05:00和03:00:00 GMT-04:00这两个时间段是相同的,仅以不同的时区/夏令时表示

    请注意,您的日期/时间解析逻辑将在秋季遇到问题,因为1和2之间的时间被“执行”两次。根据,11月1日凌晨2点,时钟将设置回凌晨1点。所以

    Date(2020, 10, 01, 01, 30, 00)
    

    无法确定它仍然是EDT还是已经是EST。您需要将当前时区/偏移量传递到UTC。

    我强烈建议使用MomentJS。另外:您将日期传递为日期(2020,02,08,01)。凌晨2点你用哪种代码?输入:2020,02,08,01是2月8日,不是3月。@Christoph不,不是。JS月从0开始,糟糕;-)如何通过忽略日光来获得准确的日期时间?我需要根据我的参数(年、月、日期、小时)获取输出。我正在添加timezoneOffset,它可以完美地用于所有日期时间,3月8日凌晨2点除外。如何通过忽略日光变化来获得特定时间的准确日期时间?此外,新日期(2020,02,8,3)可以完美地返回Sun Mar 08 2020 03:00:00 GMT-0400(东部标准时间)。3月8日没有凌晨2点(GMT-05),至少东部时区没有。格林尼治标准时间01:59:59-05:00一秒钟后,时钟跳至格林尼治标准时间03:00:00-04:00。这种跳跃反映在GMT中,它实际上是GMT的一个偏移量。