搞懂 moment |
您所在的位置:网站首页 › 时区和经纬度怎么区分出来 › 搞懂 moment |
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 |