我从供应商那里获得了一个时间戳,该时间戳位于美国中部时间,但是没有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
答案 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的担忧。