【问题标题】:Transform Epoch UTC to String EST using momentjs使用 momentjs 将 Epoch UTC 转换为字符串 EST
【发布时间】:2021-04-26 06:11:06
【问题描述】:

我有两个输入变量: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

【问题讨论】:

    标签: timezone momentjs timezone-offset


    【解决方案1】:

    首先,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 或其他几个库。

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

    【讨论】:

    • 优秀。正是我需要的。谢谢。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2023-04-07
    • 2014-05-24
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多