【问题标题】:Moment JS - convert user-submitted date/time/timezone to timezone-independent UTCMoment JS - 将用户提交的日期/时间/时区转换为独立于时区的 UTC
【发布时间】:2016-10-03 18:32:03
【问题描述】:

在我的 Node.js 应用程序中,用户提交日期、时间和时区(单独的表单字段)。使用 Moment Timezone,我正在尝试保存调整为无偏移的日期(与时区无关)。

下面的代码有效,但是有没有更简单/更简洁的方法来实现相同的结果?必须将偏移量乘以 -1 似乎很骇人:

const userDate = new Date(req.body.date + ' ' + req.body.time);
const userTz = req.body.tz;

const offset = moment.tz(userTz).utcOffset();
const utc = moment(userDate).utcOffset(-1*offset).format('YYYY-MM-DD[T]HH:mm:ss');

示例输入:

Date: 09/06/2016 (via Bootstrap date picker)
Time: 07:41:00 (via Bootstrap time picker)
Timezone: America/New_York (UTC/GMT -4 hours)

返回(正确):

2016-09-06T11:41:00Z

提前致谢!

【问题讨论】:

  • moment.js,作为您可以使用的 utc 变体。例如。 moment.utc() -> momentjs.com/docs/#/parsing/utc
  • 如何在没有原始时区知识的情况下使用 .utc() 正确调整偏移量?
  • 未测试。你可以链接类似 moment(userDate).tz(userTz).utc().format('YYYY-MM-DD HH:mm:ss')

标签: javascript node.js datetime momentjs


【解决方案1】:

您可以使用tz 在用户输入的时区中创建一个日期,javascript 日期对象中没有直接的方法。使用moment.tz 重建日期后,继续将其转换为utc,现在根据需要格式化。

另外,在从不同时区运行的浏览器中检查您的解决方案(显示在问题中),我很确定它会给出不同的结果。

let req = {};
 req.body = {date: "09/06/2016",
             time: "07:41:00",
             tz: "America/New_York"};

const a = moment
           .tz(req.body.date+ " " + req.body.time,"MM/DD/YYYY HH:mm:ss" ,req.body.tz)
           .utc()
           .format();

console.log(a);
<script src="http://momentjs.com/downloads/moment.min.js"></script>
<script src="http://momentjs.com/downloads/moment-timezone-with-data-2010-2020.min.js"></script>

【讨论】:

  • 谢谢!我没有澄清的一件小事是我的 req.body.date 是 MM/DD/YYYY 格式,而不是 DD/MM/YYYY,因此需要相应地更新日期格式字符串。
  • 对于输出,您不会将MM/DD/YYYY 与T 和Z 一起使用。那些表示 ISO8601,它只允许 YYYY-MM-DD
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2021-12-14
  • 2016-06-17
  • 2022-12-17
  • 2016-02-17
  • 2018-10-31
相关资源
最近更新 更多