使用 momentjs 将 Epoch UTC 转换为 String EST

问题描述

我有两个输入变量:UTC 时区的纪元时间和实际时区的名称。如何使用会考虑 DST 更改的 moment.js 获取格式化的日期/时间。我试过这段代码,但它不起作用。请问我做错了什么?

var abs_time = 1611188219.277; // this is UTC coresponding to 1/21/2021 18:31:37 UTC
var timezone = "America/New_York"; // this the actual time zone

var mom = moment(abs_time * 1000).format();
var date_time = moment.tz(mom,timezone).format('ddd,MMM DD YYYY - HH:mm');
console.log(date_time);

//actual result: Thu,Jan 21 2021 - 18:31
//desired result: Thu,Jan 21 2021 - 13:31 - in the summer this should only be 4 hour difference

解决方法

首先,1611188219.277 实际上对应于 2021-01-21T00:16:59.277Z,而不是您在问题中给出的时间(假设它是具有秒精度的 Unix 时间戳)。这可以通过以下代码看到:

const d = new Date(1611188219.277 * 1000);
const s = d.toISOString();
console.log(s);

只要您对 toLocaleString 函数产生的输出感到满意,您就可以在没有任何库的情况下获得特定时区的等效本地时间。

const d = new Date(1611188219.277 * 1000);
const s = d.toLocaleString(undefined,{ timeZone: 'America/New_York' });
console.log(s);

请注意,上面代码中的 undefined 将使用浏览器的当前语言。如果你想要一种特定的语言,你可以在那里传递它的语言代码(例如 enen-US 等)

一般来说,由于 its project status,您应该避免使用 Moment,除非它已经在现有项目中使用。但是,如果您必须为此使用 Moment 和 Moment-TimeZone,您可以执行以下操作以获得相同的结果:

const m = moment.tz(1611188219.277 * 1000,'America/New_York');
const s = m.format('ddd,MMM DD YYYY - HH:mm');
console.log(s);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.32/moment-timezone-with-data-10-year-range.min.js"></script>

我使用了与您的问题相同的格式,但当然您可以根据需要进行更改。

您还可以考虑使用 Luxon(Moment 的继承者)、Date-fns 或其他几个库。

是的,以上所有内容都会正确考虑夏令时。