【发布时间】:2019-07-27 23:35:39
【问题描述】:
我的情况是这样的:
我有一个接受用户输入的日期选择器,它假定选择的日期/时间是本地时间。我似乎无法改变这种行为。用户实际上应该选择欧洲/伦敦时间的日期/时间,因为他们当时正在伦敦预订服务。
假设他们预订了早上 5 点从伦敦起飞的航班。
所以我有用户选择的这个日期(来自新西兰):
2019-08-01T05:00:00+12:00 (NZ time)
我需要将其更改为:
2019-08-01T05:00:00+01:00 (Europe/London time)
之后我将发送到服务器并存储为 UTC。
如果有帮助,我正在使用 momentjs。
编辑: 最新尝试: 我只需要弄清楚如何从用户输入的确切时间获取时区偏移量,这样我就涵盖了夏令时。 例如下面我得到了前一天的英国偏移量,所以可能有 DST 问题
const moment = require('moment-timezone');
const nzd = '2019-08-01T05:00:00+12:00'; // This is the date my user entered via the datepicker
const ukTempString = moment(new Date(nzd.slice(0, -6))).tz('Europe/London').format('YYYY-MM-DDTHH:mm:ssZ'); // 2019-07-31T18:00:00+01:00
const ukOffset = ukTempString.substr(ukTempString.length - 6); // +01:00
const ukString = nzd.slice(0, -6) + ukOffset; // 2019-08-01T05:00:00+01:00
const ukDate = new Date(ukString); // I can then this to the backend
编辑:
目前的解决方案:
英国没有夏令时示例:
let nzd = moment('2019-10-27T05:00:00+13:00'); // This is the date my user entered via the datepicker
let nzString = nzd.format('YYYY-MM-DDTHH:mm:ssZ');
let ukd = moment().tz('Europe/London');
ukd.set(nzd.toObject());
console.log(ukd.format('YYYY-MM-DDTHH:mm:ssZ')); // 2019-10-27T05:00:00+00:00
let ukDate = new Date(ukd.format('YYYY-MM-DDTHH:mm:ssZ')); // I can then this to the backend
console.log(ukDate.toUTCString()); // Sun, 27 Oct 2019 05:00:00 GMT
在英国有 DST 示例(相同的代码):
nzd = moment('2019-10-27T00:30:00+13:00'); // This is the date my user entered via the datepicker
nzString = nzd.format('YYYY-MM-DDTHH:mm:ssZ');
ukd = moment().tz('Europe/London');
ukd.set(nzd.toObject());
console.log(ukd.format('YYYY-MM-DDTHH:mm:ssZ')); // 2019-10-27T00:30:00+01:00
ukDate = new Date(ukd.format('YYYY-MM-DDTHH:mm:ssZ')); // I can then this to the backend
console.log(ukDate.toUTCString()); // Sat, 26 Oct 2019 23:30:00 GMT
【问题讨论】:
-
一旦你有了像
date = new Date()这样的JavaScript Date 对象,由于伦敦是UTC 的所在地,你可以很方便地使用date.getTime(时间戳)或任何date.getUTC{{X}}方法(例如date.getUTCHours)。请参阅:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…(如果您需要 DST 调整后的伦敦时间,从技术上讲,这不再是 UTC,您需要检查 DST 目前在伦敦是否有效。)
标签: javascript angular momentjs