安装
npm install moment-timezone --save
引用
import moment from 'moment-timezone'
使用
获取用户时区
moment.tz.guess()
默认情况下,Moment Timezone会缓存检测到的时区,也就是后续调用moment.tz.guess()
将始终返回相同的值(即使在两次调用中已经更改了时区)。
要忽略缓存并使用新值覆盖缓存,需要调用带参数的方法:
moment.tz.guess(true)
使用(解析)时区
给已知时间加上时区
使用方法:moment.tz(..., String)
,最后一个参数String是时区标识符:
let a = moment.tz('2021-08-20 10:00:00', 'Asia/Monterrey')
let b = moment.tz('2021-08-20 10:00:00', 'America/New_York')
a.format('YYYY/MM/DD HH:mm:ss Z z') //2021/08/20 10:00:00 -05:00 CDT
b.format('YYYY/MM/DD HH:mm:ss Z z') //2021/08/20 10:00:00 -04:00 EDT
a.utc().format() //2021-08-20T15:00:00Z
b.utc().format() //2021-08-20T14:00:00Z
创建的时刻具有不同的UTC时间,是因为这些时刻是在不同的时区创建的。
将已知时间转换到指定时区
使用方法:moment(...).tz(String)
,String是时区标识符:
let a = moment('2021-08-20 10:00:00').tz('America/Monterrey')
let b = moment('2021-08-20 10:00:00').tz('America/New_York')
a.format('YYYY/MM/DD HH:mm:ss Z z') //2021/08/19 21:00:00 -05:00 CDT
b.format('YYYY/MM/DD HH:mm:ss Z z') //2021/08/19 22:00:00 -04:00 EDT
a.utc().format() //2021-08-20T02:00:00Z
b.utc().format() //2021-08-20T02:00:00Z
首先moment('2021-08-20 10:00:00')
即在默认时区中创建对象,然后tz(String)
将其时区更改为指定的时区
创建的时刻具有相等的UTC时间,因为这些时刻是在默认时区中创建的
注意:上面两种方法得到不同结果的原因是因为传入的时间字符串'2021-08-20 10:00:00'
本身是没有时区标识的,所以在转换的时候不同方法会加上不同的时区标识导致的差异,但是如果传入的时间本身就是能明确时间的时间戳、UTC时间('2021-10-31T07:01:00Z')的话,这两种方法得到的结果就是一样的了。
格式化
moment.tz(String).format("Z z"); // -08:00 CST
moment.tz(String).zoneAbbr(); // CST
moment.tz(String).zoneName(); // CST
代号 | 用途 | 示例 |
---|---|---|
大写Z | 获取偏移量 | +08:00 |
小写z | 获取缩写时区名称 | CST |
注意:小写z格式化标记并不总是显示缩写的时区名称,而是显示每个区域的时间偏移。
moment.tz('America/Los_Angeles').format('z') // "PDT" (abbreviation)
moment.tz('Asia/Magadan').format('z') // "+11" (3-char offset)
moment.tz('Asia/Colombo').format('z') // "+0530" (5-char offset)
设置默认时区
moment.tz.setDefault(zone); //设置默认时区为zone代表的时区。
moment.tz.setDefault(); //重置默认时区为本地时区。
注意:后续调用moment.tz.setDefault
不会影响现有moment对象或其克隆。