Javascript 将日期转换为历元秒时从时刻时区获取错误值

Javascript 将日期转换为历元秒时从时刻时区获取错误值,javascript,momentjs,Javascript,Momentjs,我有一个用例,用户在其时区中选择未来的日期和时间。在这种情况下,美国中央时间。我想将给定时区的日期转换为纪元秒,我需要将其传递给第三方API 以下是我到目前为止的部分单元测试代码: moment.tz.add('America/Chicago'); // This value is returned by Mongoose as a Date, which is why I'm using Date() here const publishAt = new Date('2017-07-26T1

我有一个用例,用户在其时区中选择未来的日期和时间。在这种情况下,美国中央时间。我想将给定时区的日期转换为纪元秒,我需要将其传递给第三方API

以下是我到目前为止的部分单元测试代码:

moment.tz.add('America/Chicago');

// This value is returned by Mongoose as a Date, which is why I'm using Date() here
const publishAt = new Date('2017-07-26T12:00:00.000Z');

const publishAtEpoch = moment.tz(publishAt, 'America/Chicago').valueOf() / 1000;
其结果是:

1501070400
而不是:

1501088400
这是不正确的,根据:

值1501070400太早了5小时

如果我为日期传递一个简单的字符串:
2017-07-26 12:00:00
它会按预期工作

如果我使用一个简单的日期:
新日期('2017-07-26 12:00:00')该值太早1小时,因为我的时区是美国东部


我做错了什么?我认为矩时区应该处理偏移量,考虑夏令时等。

您的
publishAt
日期是使用以
Z
结尾的字符串创建的,因此它以UTC表示时间。如您所见,自Unix纪元起,
publishAt
()的值(毫秒)为
1501070400000

1501070400000
2017年7月26日12:00:00 UTC
(参见偏移量为
0
的记录 在链接的表中以秒为单位)

在我看来,问题在于您希望得到的是
1501088400000
,而不是
1501070400000
,这是
新日期('2017-07-26T12:00:00.000Z')的“真实”值

moment.tz('2017-07-26 12:00:00','America/Chicago')
给出了
1501088400000
,因为您告诉to moment将您的字符串解析为芝加哥的时间,而
新日期('2017-07-26 12:00:00')
为您的本地时区创建日期

请注意,时刻时区规定:

Unix时间戳和
Date
对象指的是特定的时间点,因此在构造时使用时区偏移是没有意义的。使用
moment.tz(数字|日期,区域)
在功能上等同于
moment(数字|日期).tz(区域)

下面是一个显示所述结果的片段:

const publishAt=新日期('2017-07-26T12:00:00.000Z');
console.log(publishAt.getTime());//1501070400000
const publishAtEpoch=矩.tz(publishAt,'美国/芝加哥').valueOf()/1000;
console.log(publishAtEpoch);//1501070400
const timeChicago=moment.tz('2017-07-26T12:00:00.000','America/Chicago');
console.log(timeChicago.valueOf()/1000);//1501088400


请记住为publishAt var设置新日期的上下文。这将在运行应用程序的系统的数据上下文中创建,这意味着它将被转换为tz。听起来我可能只需要将日期分解为其组成部分,然后将其传递给矩。感谢您提供的
.unix()
提示,现在我明白了矩跳过偏移量的原因。是的,我希望得到给定用户时区的日期。通过将时间转换为简单的时间字符串,然后传入偏移量,我可以得到我想要的,然后让时间来处理夏令时。重新阅读您的答案后,1501074000应该是正确的,而不是1501088400。我想我不明白如何显示他们的结果。我编辑了我的答案和示例,该示例解析毫秒并以本地时间、UTC和芝加哥时区显示结果,也许它可以帮助您更好地理解epochconverter的功能。