首页 > 解决方案 > Momentjs 显示所有时区的相同日期

问题描述

我正在尝试通过用户的浏览器使用 momentjs 转换 DateTime。

这里发生了什么:

let timezone = moment.tz.guess();
console.log('timezone:', timezone);
let iso_date = moment('06-04-2020 12:22:05 PM', 'MM-D-YYYY hh:mm:ss A').toISOString();
console.log('iso_date:', iso_date)
console.log('from timezone:', moment(iso_date).tz(timezone).format('lll'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data.min.js"></script>

我想根据用户的浏览器转换日期时间。但无论我尝试什么,我都会得到相同的日期时间而没有改变。如何获得不同时区的不同日期时间?

Inputted date: 06-04-2020 12:22:05 PM', 'MM-D-YYYY hh:mm:ss A Inputted timezone: America/Los_Angeles Expected Output: Jun 4, 2020 12:22 PM

太平洋时间

Inputted date: 06-04-2020 12:22:05 PM', 'MM-D-YYYY hh:mm:ss A Inputted timezone: Asia/Calcutta Expected Output: Jun 5, 2020 12:52 AM

IST

标签: javascriptdatetimetimezonemomentjs

解决方案


这是正在发生的事情。

let iso_date = moment('06-04-2020 12:22:05 PM', 'MM-D-YYYY hh:mm:ss A').toISOString();

从 '06-04-2020 12:22:05 PM' 创建一个日期,将值视为本地,然后返回该日期的 UTC 版本的 ISO 8601 字符串,例如 2020-06-04T06:52:05Z。

console.log('from var:', moment(iso_date).tz(timezone).format('lll'));

获取 ISO 格式的字符串并将其解析为 UTC,然后为本地时区创建时间戳。所以它应该产生与原始时间戳相同的日期和时间。

代码所做的只是将时间戳解析为本地时间戳,生成等效的 UTC 时间戳,然后通过将 UTC 时间戳转换为本地时间戳来反转该过程。

如何获得不同时区的不同日期时间?

使用不同的位置进行解析和格式化。如果您对两者使用相同的位置,或者使用相同偏移量的位置,那么您将获得相同的日期和时间。这与执行以下操作完全相同:

let s = 'Fri Jun 05 2020 10:41:25';
let d = new Date(s);
let utc = d.toISOString();
console.log(
  'Started with : ' + s +
  '\nConverted to : ' + utc +  
  '\nBack to local: ' + new Date(utc).toString()
);


推荐阅读