Moment JS - 将用户提交的日期/时间/时区转换为与时区无关的UTC

时间:2016-10-03 18:32:04

标签: javascript node.js datetime momentjs

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

下面的代码有效,但是有更简单/更清晰的方法来实现相同的结果吗?不得不将偏移量乘以-1似乎是hackish:

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

提前致谢!

1 个答案:

答案 0 :(得分:3)

您可以使用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>