要使用矩时区,你需要moment@2.9.0+
,moment-timezone.js
和moment-timezone
数据。
为了方便起见,在momentjs.com/timezone/上有可用的构建,其中包含所有区域数据或数据的子集。
moment-timezone-with-data.js
建议在服务器环境(Node.js)中使用,并涵盖所有可用年份。moment-timezone-with-data-10-year-range.js
建议在大多数浏览器环境中使用,建议距发布年份+/- 5年。moment-timezone-with-data-1970-2030.js
涵盖60年范围,适用于需要更多数据但不需要完整数据文件较大文件大小的文件。如果您使用上述文件之一,则仍需要moment.js
,但moment-timezone.js
因为包含其中,所以不需要。
npm install moment-timezone
在Node.js中,所有数据都已预加载。加载数据不需要其他代码。
var moment = require('moment-timezone');
moment().tz("America/Los_Angeles").format();
require.config({
paths: {
"moment": "path/to/moment"
}
});
define(["path/to/moment-timezone-with-data"], function (moment) {
moment().tz("America/Los_Angeles").format();
});
有两个接口可用于Moment.js的时区。
moment.tz(..., String)
用于创建带有时区的时刻。它moment
使用与构造函数相同的所有参数,但将最后一个参数用作时区标识符:
var a = moment.tz("2013-11-18 11:55", "Asia/Taipei");
var b = moment.tz("2013-11-18 11:55", "America/Toronto");
a.format(); // 2013-11-18T11:55:00+08:00
b.format(); // 2013-11-18T11:55:00-05:00
a.utc().format(); // 2013-11-18T03:55Z
b.utc().format(); // 2013-11-18T16:55Z
请注意,创建的时刻具有不同的UTC时间,因为这些时刻是在不同的时区中创建的。
moment().tz(String)
用于更改现有时刻的时区。var a = moment("2013-11-18 11:55").tz("Asia/Taipei");
var b = moment("2013-11-18 11:55").tz("America/Toronto");
a.format(); // 2013-11-18T19:55:00+08:00
b.format(); // 2013-11-18T06:55:00-05:00
a.utc().format(); // 2013-11-18T11:55Z
b.utc().format(); // 2013-11-18T11:55Z
在此示例中,您首先moment("2013-11-18 11:55")
在默认时区中创建对象,然后将其时区更改为指定的时区。
请注意,创建的时刻具有相等的UTC时间,因为这些时刻是在默认时区中创建的。
moment.tz(..., String);
该moment.tz
构造函数接受所有相同的参数moment
的构造函数,但使用的最后一个参数的时区标识符。
var a = moment.tz("2013-11-18 11:55", "America/Toronto");
var b = moment.tz("May 12th 2014 8PM", "MMM Do YYYY hA", "America/Toronto");
var c = moment.tz(1403454068850, "America/Toronto");
a.format(); // 2013-11-18T11:55:00-05:00
b.format(); // 2014-05-12T20:00:00-04:00
c.format(); // 2014-06-22T12:21:08-04:00
此构造函数支持DST,并且在解析时将使用正确的偏移量。
moment.tz("2013-12-01", "America/Los_Angeles").format(); // 2013-12-01T00:00:00-08:00
moment.tz("2013-06-01", "America/Los_Angeles").format(); // 2013-06-01T00:00:00-07:00
仅当使用数组,没有偏移量的字符串或对象构造时,才考虑偏移量。
var arr = [2013, 5, 1],
str = "2013-12-01",
obj = { year : 2013, month : 5, day : 1 };
moment.tz(arr, "America/Los_Angeles").format(); // 2013-06-01T00:00:00-07:00
moment.tz(str, "America/Los_Angeles").format(); // 2013-12-01T00:00:00-08:00
moment.tz(obj, "America/Los_Angeles").format(); // 2013-06-01T00:00:00-07:00
moment.tz(arr, "America/New_York").format(); // 2013-06-01T00:00:00-04:00
moment.tz(str, "America/New_York").format(); // 2013-12-01T00:00:00-05:00
moment.tz(obj, "America/New_York").format(); // 2013-06-01T00:00:00-04:00
如果输入字符串包含偏移量,则将其用于解析。然后,已解析的矩将转换为目标区域。
var zone = "America/Los_Angeles";
moment.tz('2013-06-01T00:00:00', zone).format(); // 2013-06-01T00:00:00-07:00
moment.tz('2013-06-01T00:00:00-04:00', zone).format(); // 2013-05-31T21:00:00-07:00
moment.tz('2013-06-01T00:00:00+00:00', zone).format(); // 2013-05-31T17:00:00-07:00
Unix时间戳和Date
对象引用特定的时间点,因此在构造时使用时区偏移是没有意义的。使用moment.tz(Number|Date, zone)
在功能上等同于moment(Number|Date).tz(zone)
。
var timestamp = 1403454068850,
date = new Date(timestamp);
moment.tz(timestamp, "America/Los_Angeles").format(); // 2014-06-22T09:21:08-07:00
moment(timestamp).tz("America/Los_Angeles").format(); // 2014-06-22T09:21:08-07:00
moment.tz(date, "America/Los_Angeles").format(); // 2014-06-22T09:21:08-07:00
moment(date).tz("America/Los_Angeles").format(); // 2014-06-22T09:21:08-07:00
Уou可以在format参数之后直接指定布尔值以使用严格解析。严格的解析要求格式和输入完全匹配,包括delimeters。
moment.tz('It is 2012-05-25', 'YYYY-MM-DD', "America/Toronto").isValid(); // true
moment.tz('It is 2012-05-25', 'YYYY-MM-DD', true, "America/Toronto").isValid(); // false
moment.tz('2012-05-25', 'YYYY-MM-DD', true, "America/Toronto").isValid(); // true
moment.tz('2012-05.25', 'YYYY-MM-DD', true, "America/Toronto").isValid(); // false
由于夏时制,时间可能不存在或存在两次。
在春天,夏令时开始时,时钟向前移动一个小时。在现实中,不是时间在移动,而是偏移在移动。
向前移动偏移量会给人一个小时消失的错觉。随着时钟滴答,你可以看到它从移动1:58
到1:59
到3:00
。包括偏移量时,更容易看到实际情况。
1:58 -5
1:59 -5
3:00 -4
3:01 -4
其结果是,之间的任何时间1:59:59
,并3:00:00
没有真正发生过。时区时区就是这个原因。如果您尝试解析一个不存在的时间,它将向前跳过DST间隔的时间(通常为1小时)。
moment.tz("2012-03-11 01:59:59", "America/New_York").format() // 2012-03-11T01:59:59-05:00
moment.tz("2012-03-11 02:00:00", "America/New_York").format() // 2012-03-11T03:00:00-04:00
moment.tz("2012-03-11 02:59:59", "America/New_York").format() // 2012-03-11T03:59:59-04:00
moment.tz("2012-03-11 03:00:00", "America/New_York").format() // 2012-03-11T03:00:00-04:00
在此示例中,两点钟不存在,因此将其等同于三点钟。
在秋天,夏令时结束时,时钟向后移动一个小时。同样,时间没有向后移动,只有偏移量在移动。在这种情况下,幻觉是一个小时重复。
同样,当包含偏移量时,更容易看到实际情况。
1:58 -4
1:59 -4
1:00 -5
1:01 -5
Moment Timezone通过始终使用重复小时的较早实例来处理此问题。
moment.tz("2012-11-04 00:59:59", "America/New_York"); // 2012-11-04T00:59:59-04:00
moment.tz("2012-11-04 01:00:00", "America/New_York"); // 2012-11-04T01:00:00-04:00
moment.tz("2012-11-04 01:59:59", "America/New_York"); // 2012-11-04T01:59:59-04:00
moment.tz("2012-11-04 02:00:00", "America/New_York"); // 2012-11-04T02:00:00-05:00
除非您在解析时包含偏移量,否则将无法使用重复小时的更高版本实例来创建时刻。
moment.tz("2012-11-04 01:00:00-04:00", "America/New_York"); // 2012-11-04T01:00:00-04:00
moment.tz("2012-11-04 01:00:00-05:00", "America/New_York"); // 2012-11-04T01:00:00-05:00
moment().tz(String);
该moment#tz
突变将更改时区,并更新所抵消。
moment("2013-11-18").tz("America/Toronto").format('Z'); // -05:00
moment("2013-11-18").tz("Europe/Berlin").format('Z'); // +01:00
此信息在其他操作(例如计算一天的开始时间)中始终使用。
var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.format(); // 2013-11-18T11:55:00-05:00
m.startOf("day").format(); // 2013-11-18T00:00:00-05:00
m.tz("Europe/Berlin").format(); // 2013-11-18T06:00:00+01:00
m.startOf("day").format(); // 2013-11-18T00:00:00+01:00
不带参数,moment#tz
返回:
undefined
如果尚未设置时区。var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.tz(); // America/Toronto
var m = moment.tz("2013-11-18 11:55");
m.tz() === undefined; // true
moment.tz(String).format("Z z"); // -08:00 PST
moment.tz(String).zoneAbbr(); // PST
moment.tz(String).zoneName(); // PST
除了包含+00:00
格式信息外,“时区时区”还包含有关时区名称缩写的信息。
moment.tz([2012, 0], 'America/New_York').format('z'); // EST
moment.tz([2012, 5], 'America/New_York').format('z'); // EDT
moment.tz([2012, 0], 'America/Los_Angeles').format('z'); // PST
moment.tz([2012, 5], 'America/Los_Angeles').format('z'); // PDT
请注意,这些缩写可能会根据时区偏移量而变化。这有助于区分可能使用或不使用DST的位置之间的偏移。
// Denver observes DST
moment.tz([2012, 0], 'America/Denver').format('Z z'); // -07:00 MST
moment.tz([2012, 5], 'America/Denver').format('Z z'); // -06:00 MDT
// Phoenix does not observe DST
moment.tz([2012, 0], 'America/Phoenix').format('Z z'); // -07:00 MST
moment.tz([2012, 5], 'America/Phoenix').format('Z z'); // -07:00 MST
还请注意,这些缩写不是全局唯一的。在下面,您可以看到美国中央标准时间和中国标准时间都具有相同的缩写。
moment.tz('2016-01-01', 'America/Chicago').format('z'); // CST
moment.tz('2016-01-01', 'Asia/Shanghai').format('z'); // CST
您也可以使用moment#zoneAbbr
来获取区域的缩写。这是moment.js在格式化z
令牌时使用的内容。
moment.tz([2012, 0], 'America/New_York').zoneAbbr(); // EST
moment.tz([2012, 5], 'America/New_York').zoneAbbr(); // EDT
Moment.js还为长格式时区名称提供了一个钩子。因为这些字符串通常是本地化的,所以Moment Timezone不会为区域提供任何长名称。
要提供长格式名称,您可以覆盖moment.fn.zoneName
和使用zz
令牌。
var abbrs = {
EST : 'Eastern Standard Time',
EDT : 'Eastern Daylight Time',
CST : 'Central Standard Time',
CDT : 'Central Daylight Time',
MST : 'Mountain Standard Time',
MDT : 'Mountain Daylight Time',
PST : 'Pacific Standard Time',
PDT : 'Pacific Daylight Time',
};
moment.fn.zoneName = function () {
var abbr = this.zoneAbbr();
return abbrs[abbr] || abbr;
};
moment.tz([2012, 0], 'America/New_York').format('zz'); // Eastern Standard Time
moment.tz([2012, 5], 'America/New_York').format('zz'); // Eastern Daylight Time
moment.tz([2012, 0], 'America/Los_Angeles').format('zz'); // Pacific Standard Time
moment.tz([2012, 5], 'America/Los_Angeles').format('zz'); // Pacific Daylight Time
请注意,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(String);
默认情况下,moment
对象是在本地时区创建的。
本地时区-这是在浏览器或node.js
服务器上设置的时区。
要更改默认时区,请使用moment.tz.setDefault
有效时区。
moment.tz.setDefault("America/New_York");
要将默认时区重置为本地,请不使用moment.tz.setDefault
任何参数。
moment.tz.setDefault();
后续的调用moment.tz.setDefault
不会影响现有moment
对象或其克隆。
moment.tz.guess();
moment.tz.guess(Boolean);
Moment时区Intl.DateTimeFormat().resolvedOptions().timeZone
在支持的浏览器中使用国际化API()来确定用户的时区。
在其他浏览器上,正确进行时区检测非常困难,因为这些浏览器提供的信息很少。对于这些,它将使用Date#getTimezoneOffset
,并Date#toString
围绕本年度时刻屈指可数收集尽可能有关浏览器的环境中尽可能多的信息。然后,它将该信息与所有加载的时区数据进行比较,并返回最接近的匹配项。如果有联系,则返回人口最多的城市所在的时区。
默认情况下,Moment Timezone缓存检测到的时区。这意味着后续的to调用moment.tz.guess()
将始终返回相同的值。
您可以moment.tz.guess()
使用可选的布尔参数“ ignoreCache” 进行调用。如果设置为true,则高速缓存将被忽略并用新值覆盖。
moment.tz.guess(); // America/Chicago
// suppose the client's timezone changes to Europe/Berlin
moment.tz.guess(); // America/Chicago
moment.tz.guess(true); // Europe/Berlin
moment.tz.guess(); // Europe/Berlin
为了使时间戳与偏移量匹配,Moment Timezone使用一个Zone
对象。
尽管您甚至不需要使用它,但该对象的构造函数在moment.tz.Zone
名称空间上可用。
该对象具有4个属性。
{
name : 'America/Los_Angeles', // the unique identifier
abbrs : ['PDT', 'PST'], // the abbreviations
untils : [1414918800000, 1425808800000], // the timestamps in milliseconds
offsets : [420, 480] // the offsets in minutes
}
zone.name; // America/Los_Angeles
时区的唯一标识名称。
zone.abbr(timestamp); // PST
从中获取给定时间戳记的缩写Zone
。
moment.tz.zone('America/Los_Angeles').abbr(1403465838805); // PDT
moment.tz.zone('America/Los_Angeles').abbr(1388563200000); // PST
zone.utcOffset(timestamp); // 480
从中获取给定时间戳记的偏移量Zone
。
moment.tz.zone('America/Los_Angeles').utcOffset(1403465838805); // 420
moment.tz.zone('America/Los_Angeles').utcOffset(1388563200000); // 480
POSIX兼容性要求偏移量是相反的。因此,Etc / GMT-X的偏移量为,+X
而Etc / GMT + X的偏移量为-X
。这是IANA 时区数据库的结果,而不是Moment.js的任意选择。因此,使用基于位置的标识符优于固定偏移量标识符。
例如,moment().tz('Etc/GMT+1').format('YYYY-MM-DD HH:mm ZZ')
将返回2014-12-18 11:22 -0100
而moment().tz('Europe/Madrid').format('YYYY-MM-DD HH:mm ZZ')
将返回2014-12-18 13:22 +0100
。的Europe/Madrid
indentifer应当用来代替Etc/GMT+1
标识符。
zone.parse(timestamp); // 480
解析从Date.UTC
该区域构造的时间戳的偏移量。
这就是Moment Timezone用于将输入解析为时区的方式。该过程在概念上类似于以下内容。
假设我们要查找March 19 2014 8:30 am
纽约的确切时刻。由于偏移量在纽约-04:00
与-05:00
纽约之间有所不同,因此我们不知道3月19日的偏移量是多少。
相反,我们在UTC中创建了一个时间戳并将其传递给zone.parse
,它将在那时返回偏移量。
var zone = moment.tz.zone('America/New_York');
zone.parse(Date.UTC(2012, 2, 19, 8, 30)); // 240
这是处理上面“ 解析歧义”部分中引用的案例的代码 。
var zone = moment.tz.zone('America/New_York');
zone.parse(Date.UTC(2012, 2, 11, 1, 59)); // 300
zone.parse(Date.UTC(2012, 2, 11, 2, 0)); // 240
时区时区使用两种数据格式。用于计算的解压缩版本和用于最小化运输的压缩版本。
解压缩后的格式看起来与zone对象完全一样。
以下数据是2014年至2018年之间洛杉矶的数据。
{
name : 'America/Los_Angeles',
abbrs : ['PST', 'PDT','PST', 'PDT', 'PST', 'PDT', 'PST', 'PDT', 'PST', 'PDT', 'PST'],
untils : [1394359200000, 1414918800000, 1425808800000, 1446368400000, 1457863200000, 1478422800000, 1489312800000, 1509872400000, 1520762400000, 1541322000000, null],
offsets : [480, 420, 480, 420, 480, 420, 480, 420, 480, 420, 480]
}
的长度abbrs, untils, offsets
都相同。的offset
和abbr
,而时间戳小于所述任何索引是唯一的活性until
该索引处。
朗读的一种简单方法是“在untils[n-1]
和之间untils[n]
,缩写应为abbrs[n]
,偏移应为offsets[n]
”。
请注意,untils
以毫秒为单位,offsets
以分钟为单位。
打包格式表示单个字符串中的未打包区域。
以下数据适用于2014年至2018年之间的洛杉矶。此处可以查看更多时区
'America/Los_Angeles|PST PDT|80 70|01010101010|1Lzm0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0'
为了节省尽可能多的字节,我们使用了非常紧凑的格式来存储数据。
数据分为5个部分,每个部分由管道分隔。
# | 类型 | 例 |
---|---|---|
0 | 名称 | America/Los_Angeles |
1个 | 亚伯地图 | PST PDT |
2 | 偏移图 | 80 70 |
3 | 缩写/偏移索引 | 01010101010 |
4 | 时间戳差异 | 1Lzm0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 |
名称:时区的规范名称。
缩写地图:用空格分隔的列表,列出了该时区中曾经使用过的所有缩写。
偏移图:以空格分隔的列表,以分钟为单位,以分钟为单位,此时区中曾经使用过的所有偏移。
Abbr / Offset Index:紧缩索引数组,包含偏移和Abbr映射。这些也以60为基数。
时间戳记差异:这是时间戳记的存储位置。
Because we are dealing with a sorted list of timestamps, we just store the diff from the last timestamps rather than storing the full timestamps.
The first item in the array is a unix timestamp in minutes. All items after the first item are numbers of minutes to be added to the previous value during unpacking. All items are stored in base 60.
As you may have seen from the example above, the timestamp diffs tend to duplicate the same values from year to year. These duplications allow gzip to compress the data even further than if we used full timestamps.
You may be wondering why base 60 is used. Base 62 is a fairly common tool for ascii
data compression, using a-z
to represent 10-35
and A-Z
to represent 36-61
.
虽然它可能已经节省了一些字节以使用基数62,但是Moment Timezone中的许多数据都很好地映射为60的倍数。
一小时有60分钟,一分钟有60秒。3小时是30
在底座60和分钟300
秒在基座60,而不是180
与10800
在基座10或2U
与2Oc
在基座62。
为了减少重复,Moment Timezone数据打包器将在两个共享完全相同的数据的区域中创建链接。
此数据是由管道分隔的两个区域名称。
moment.tz.add('America/Los_Angeles|PST PDT|80 70|01010101010|1Lzm0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0');
moment.tz.link('America/Los_Angeles|US/Pacific');
moment.tz("2013-12-01", "America/Los_Angeles").format(); // 2013-12-01T00:00:00-08:00
moment.tz("2013-12-01", "US/Pacific").format(); // 2013-12-01T00:00:00-08:00
数据打包并传输到客户端后,必须将其添加到Moment Timezone。
moment.tz.add(PackedZoneString)
moment.tz.add(PackedZoneString[])
要将区域数据添加到Moment Timezone,请使用moment.tz.add
。
moment.tz.add('America/Los_Angeles|PST PDT|80 70|0101|1Lzm0 1zb0 Op0');
要添加多个区域,请传递一组打包数据。
moment.tz.add([
'America/Los_Angeles|PST PDT|80 70|0101|1Lzm0 1zb0 Op0',
'America/New_York|EST EDT|50 40|0101|1Lz50 1zb0 Op0'
]);
注意:上面的区域数据是示例数据,不是最新的。有关最新数据,请参考力矩时区源。
moment.tz.link(PackedLinkString)
moment.tz.link(PackedLinkString[])
要将两个区域名称链接到同一数据,请使用moment.tz.link
。
传入的字符串应采用链接格式:两个区域名称用管道分隔。
moment.tz.link('America/Los_Angeles|US/Pacific');
要一次添加多个链接,请传递一组链接字符串。
moment.tz.link([
'America/Los_Angeles|US/Pacific',
'America/New_York|US/Eastern'
]);
moment.tz.load({
zones : [],
links : [],
version : '2014e'
});
Moment时区的数据来自IANA时区数据库。随着不同国家/地区时区法律的变化,新版本会定期发布。
版本以年份和递增字母命名。 2014a 2014b 2014c...
为了将版本保持在一起,Moment Timezone也具有捆绑的对象格式。
{
version : '2014e',
zones : [
'America/Los_Angeles|PST PDT|80 70|0101|1Lzm0 1zb0 Op0',
'America/New_York|EST EDT|50 40|0101|1Lz50 1zb0 Op0'
],
links : [
'America/Los_Angeles|US/Pacific',
'America/New_York|US/Eastern'
]
}
要将捆绑包加载到Moment Timezone中,请使用moment.tz.load
。
moment.tz.load({
version : '2014e',
zones : [...],
links : [...]
})
moment.tz.zone(name); // Zone or null
要检查区域是否存在,请使用moment.tz.zone
。如果已加载和null
未加载,它将返回区域。
moment.tz.zone("UnloadedZone"); // null
moment.tz.add("UnloadedZone|UZ|0|0|");
moment.tz.zone("UnloadedZone"); // Zone { name : "UnloadedZone", ...}
moment.tz.names(); // String[]
要获取所有可用时区名称的列表,请使用moment.tz.names
。
moment.tz.names(); // ["Africa/Abidjan", "Africa/Accra", "Africa/Addis_Ababa", ...]
由于打包和解压缩数据格式的复杂性,Moment Timezone具有一些经过严格测试的实用程序功能来处理数据。
拆解数据的方法包含在核心库中,这是使用库所必需的。
打包和细分数据的方法包含在其他
moment-timezone-utils.js
文件中。该文件向moment.tz
名称空间添加了更多方法。
// in moment-timezone.js
moment.tz.unpack
moment.tz.unpackBase60
// in moment-timezone-utils.js
moment.tz.pack
moment.tz.packBase60
moment.tz.createLinks
moment.tz.filterYears
moment.tz.filterLinkPack
moment.tz.pack(UnpackedObject); // PackedString
var unpacked = {
name : 'Indian/Mauritius',
abbrs : ['LMT', 'MUT', 'MUST', 'MUT', 'MUST', 'MUT'],
offsets : [-230, -240, -300, -240, -300, -240],
untils : [-1988164200000, 403041600000, 417034800000, 1224972000000, 1238274000000, null]
};
moment.tz.pack(unpacked); // "Indian/Mauritius|LMT MUT MUST|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0"
moment.tz.unpack(PackedString); // UnpackedObject
var packed = "Indian/Mauritius|LMT MUT MUST|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0";
moment.tz.unpack(packed);
// {
// name : 'Indian/Mauritius',
// abbrs : ['LMT', 'MUT', 'MUST', 'MUT', 'MUST', 'MUT'],
// offsets : [-230, -240, -300, -240, -300, -240],
// untils : [-1988164200000, 403041600000, 417034800000, 1224972000000, 1238274000000, null]
// };
moment.tz.packBase60(Number); // Base60String
将以10为底的数字转换为以60为底的字符串。
moment.tz.packBase60(9); // 9
moment.tz.packBase60(10); // a
moment.tz.packBase60(59); // X
moment.tz.packBase60(1337); // mh
与一样Number.prototype.toFixed
,moment.tz.packBase60
接受第二个参数作为精度位数。
moment.tz.packBase60(1.1667, 1); // 1.a
moment.tz.packBase60(20.12345, 3); // k.7op
moment.tz.packBase60(59, 1); // X
0
小数点前的单引号被删除。
moment.tz.packBase60(1.1667, 1); // 1.a
moment.tz.packBase60(0.1667, 1); // .a
小数点后的尾随零将被删除。
moment.tz.packBase60(1/6, 1); // .a
moment.tz.packBase60(1/6, 5); // .a
moment.tz.packBase60(59, 5); // X
moment.tz.unpackBase60(Base60String); // Number
将基数为60的字符串转换为基数为10的数字。
moment.tz.unpackBase60('9'); // 9
moment.tz.unpackBase60('a'); // 10
moment.tz.unpackBase60('X'); // 59
moment.tz.unpackBase60('mh'); // 1337
moment.tz.unpackBase60('1.9'); // 1.15
moment.tz.unpackBase60('k.7op'); // 20.123449074074074
moment.tz.createLinks(UnpackedBundle); // UnpackedBundle
为了减少重复,我们可以在两个共享数据的区域之外创建链接。
var unlinked = {
zones : [
{name:"Zone/One",abbrs:["OST","ODT"],offsets:[60,120],untils:[403041600000,417034800000]},
{name:"Zone/Two",abbrs:["OST","ODT"],offsets:[60,120],untils:[403041600000,417034800000]}
],
links : [],
version : "2014x-doc-example"
};
moment.tz.createLinks(unlinked);
{
zones : [
{name:"Zone/One",abbrs:["OST","ODT"],offsets:[60,120],untils:[403041600000,417034800000]}
],
links : ["Zone/One|Zone/Two"],
version : "2014x-doc-example"
}
与结合使用时moment.tz.filterYears
,此功能特别有用,因为可以区分两个区域的旧规则可能不在过滤的年份范围内,从而可以链接它们以节省空间。
moment.tz.filterYears(UnpackedZone, Number, Number); // UnpackedZone
默认情况下,Moment Timezone包含来自IANA时区数据库的所有数据 。其中包括1900年至2038年的数据。对于您的用例,可能不需要所有这些年份的数据。
moment.tz.filterYears
可用于过滤超出一定范围的年份的数据。
var all = { name : "America/Los_Angeles", abbrs : [...], offsets : [...] untils : [...]};
var subset = moment.tz.filterYears(all, 2012, 2016);
all.untils.length; // 186
subset.untils.length; // 11
如果仅通过了一年,则将其用于开始和结束年份。
var all = { name : "America/Los_Angeles", abbrs : [...], offsets : [...] untils : [...]};
var subset = moment.tz.filterYears(all, 2012);
all.untils.length; // 186
subset.untils.length; // 3
moment.tz.filterLinkPack(UnpackedBundle, Number, Number); // PackedBundle
打包,链接创建和年份子集都是用于压缩要传输到客户端的数据的工具。
该moment.tz.filterLinkPack
方法将所有这些组合到一个简单的界面中。传递未打包的捆绑包,开始年份和结束年份,然后返回经过过滤,链接的打包捆绑包。
这就是用来压缩主页上捆绑的数据+库文件的输出的方法。