Javascript:需要帮助,将美国中部时间(无夏令时)与夏令时转换为美国/纽约

时间:2019-10-03 19:57:11

标签: javascript date

我从供应商那里获得了一个时间戳,该时间戳位于美国中部时间,但是没有DST。我需要使用DST(如果适用)将其转换为America / New_York。

我尝试仅使用常规JavaScript,然后转到Moment。我尝试了各种方法,但无法获得预期的结果。我几乎对任何图书馆都开放。我不必使用Moment。

下面是我尝试过的多种方法中的三种。

代码段:

console.log(sendTimeString);
let d = moment(sendTimeString, "MM/DD/YYYY h:mm:ss A"); 
console.log("formatted " + d.clone().tz("America/New_York").format('MM/DD/YYYY h:mm:ss A'));

产生:

6/12/2019 6:35:36 AM

格式化06/12/2019 6:35:36 AM

那是相同的日期和时间。如果我在下面执行此操作,则暂时会得到正确的答案,但是DST结束后它将关闭。即使这行之有效,也无非是骇客。我想正确地做。

代码段:

console.log(sendTimeString);
let d = moment(sendTimeString, "MM/DD/YYYY h:mm:ss A");
console.log("formatted " + d.clone().utcOffset(-2).format('MM/DD/YYYY h:mm:ss A'));

产生:

6/12/2019 6:35:36 AM

格式化06/12/2019 8:35:36 AM

在我看来,解决方法是将时间设置为带有硬编码偏移量-6的UTC。然后,我将它与America / New_York时区联系起来,一切都会很完美。但显然我没有正确设置此值:

代码段:

console.log(sendTimeString);
let d = moment(sendTimeString, "MM/DD/YYYY h:mm:ss A").utcOffset(-6);
console.log("formatted " + d.clone().tz("America/New_York").format('MM/DD/YYYY h:mm:ss A'));

产生:

6/12/2019 6:35:36 AM

格式化06/12/2019 6:35:36 AM

1 个答案:

答案 0 :(得分:0)

似乎您的第一次尝试是最接近您的预期的,您只需要指定输入时区即可。

// Take the input from the client, specify the format and their timezone
const input = moment.tz('6/12/2019 6:35:36 AM', 'MM/DD/YYYY h:mm:ss A', 'US/Central')

console.log(input.tz())
console.log(input.format('MM/DD/YYYY h:mm:ss A'))

// Convert to your timezone
const output = input.clone().tz('America/New_York')

console.log(output.tz())
console.log(output.format('MM/DD/YYYY h:mm:ss A'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.26/moment-timezone-with-data.min.js"></script>

parsing ambiguity时刻Moment Timezone的文档可能会解决您对DST的担忧。