搞懂 moment

您所在的位置:网站首页 时区和经纬度怎么区分出来 搞懂 moment

搞懂 moment

2024-04-09 21:41| 来源: 网络整理| 查看: 265

moment-timezone 插件:momentjs.com/timezone/

使用时需要先安装 yarn add moment-timezone。

这里理一理两个 API:moment(time).tz(timezone) 和 moment.tz(time, timezone) 的区别。

1. 时区

首先,不管哪个 "时间",在地球上都是同一个 "时间",只不过在不同时区的显示不一样。

虽然这是个常识,但在实际操作中很容易混乱,所以得再理解一下。

北京是白天,纽约是晚上,但打通视频,"此刻" 是同一个时刻,地球上的同一个时刻。

只不过 "显示" 的时间不一样。

2. moment(time).tz(timezone)

moment(time).tz(timezone) 是把一个 "时间"(一般是自己当前时区的时间)的时区,变为指定的时区。

主要是用于显示,所以插件官网上的例子,都是跟着 .format()。

请注意这个 "时间",就是不管跟着的 .tz() 怎么变,其实都是同一个时间。

所以用 .unix() 取值时,都是同一个值,因为它就是同一个时间。

比如获取到北京的某个时间,那就是看北京的这个时间,在全世界其它地方显示是几点。

3. moment.tz(time, timezone)

moment.tz(time, timezone) 是创建一个 moment 对象,这里分 2 种情况:

如果传入的 time 上携带了时区,那就跟 moment(time).tz(timezone) 没任何区别,都是把某个时间的时区,变为指定的时区。 如果传入的 time 上没携带时区,那就不一样了。是创建一个指定 timezone 的时间。比如在北京操作,传入 (2022-05-22 08:00:00, 纽约),那就是创建一个纽约早上 8 点的时间(而不是北京早上 8 点的时间,在纽约显示是几点)。 4. 获取时间在指定时区的 unix

经常遇到这种需求:获取一个时间点在其它时区的 unix。

很容易这么干:

moment(time).tz(timezone).unix() 或

moment.tz(time, timezone).unix() (若 time 为 moment 对象,或为时间字符串但携带了时区信息)

然后就会发现,无论 timezone 怎么变,得到的 unix 值都一样。

这是因为上面都是只更改时间的时区,但这个 "时间" 本身一直没变。

想要创建一个指定时区的时间,得这么干:

const clean = moment(time).format('YYYY-MM-DD HH:mm:ss'); // 清除 timezone 信息 const local = moment.tz(clean, timezone);

此时取值 local.unix(),才可以得到这个时间在指定时区的 unix 值。

5. 有没有更简单的办法?

当然是有的。

必须吐槽一下:不管是 moment,还是 dayjs,timezone 的文档都太简略了,根本没标明其它参数。

翻看 moment-timezone 的源码会发现,.tz() 其实还有第二个参数:keepLocalTime。

github.com/moment/mome…

所以上面问题的解决方案,其实很简单:

const local = moment(time).tz(timezone, true);

多传个 true 就行了!

区别(若在北京操作):

moment(早上八点).tz(纽约); // 把 "北京早上八点" 的时区变为纽约 moment(早上八点).tz(纽约, true); // 返回一个 "纽约早上八点" 的时间


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3