使用 momentjs 将 Epoch UTC 转换为字符串 EST

Transform Epoch UTC to String EST using momentjs

我有两个输入变量:UTC 时区的纪元时间和实际时区的名称。如何使用 moment.js 获得格式化的 day/time 以考虑 DST 更改。我试过这段代码,但没有成功。请问我做错了什么?

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 (the successor to Moment), or Date-fns 或其他几个库。

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