javascript - 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
解决方案
这是正在发生的事情。
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()
);
推荐阅读
- amazon-web-services - AWS EC2 Autoscaling Target Tracking 策略如何扩展?
- javascript - [JS/HTML/PHP]刷新页面后的特定div
- c# - DryIoc:将请求范围服务的代理注入单例
- javascript - 为什么 window.getSelection() 不工作?它不会占用文本
- javascript - 如何通过全局 .scss 文件而不是 Vue 中的 main.js 导入引导程序
- wordpress - WordPress:所有帖子都在呈现,而不是仅在分类页面上呈现分配的分类帖子
- python - 如何使用 NLP 和 Python 在字符串中查找城市名称
- c++ - 在编译时将 const char* 转换为 const char_type*
- elasticsearch - Elasticsearch 5.6 身份验证
- c# - 在特定时间提交 Asp.net MVC 后,是否有对 3 个文本框执行操作的功能