Moment Timezone 文档

要使用矩时区,你需要moment@2.9.0+moment-timezone.jsmoment-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因为包含其中,所以不需要

Node.js

npm install moment-timezone

在Node.js中,所有数据都已预加载。加载数据不需要其他代码。

var moment = require('moment-timezone');
moment().tz("America/Los_Angeles").format();

浏览器

<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>

在浏览器中使用Moment Timezone时,您将需要加载数据和库。

您可以使用主页上链接的预构建库和数据文件,也可以自己构建数据的子集并加载

moment().tz("America/Los_Angeles").format();

Require.js

require.config({
    paths: {
        "moment": "path/to/moment"
    }
});
define(["path/to/moment-timezone-with-data"], function (moment) {
    moment().tz("America/Los_Angeles").format();
});

有两个接口可用于Moment.js的时区。

  1. 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时间,因为这些时刻是在不同的时区中创建的。

  1. 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:581:593: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 -0100moment().tz('Europe/Madrid').format('YYYY-MM-DD HH:mm ZZ')将返回2014-12-18 13:22 +0100Europe/Madridindentifer应当用来代替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都相同。offsetabbr,而时间戳小于所述任何索引是唯一的活性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.

Base 60?

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,而不是18010800在基座10或2U2Oc在基座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]
// };

装箱基准60

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.toFixedmoment.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

开箱60

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方法将所有这些组合到一个简单的界面中。传递未打包的捆绑包,开始年份和结束年份,然后返回经过过滤,链接的打包捆绑包。

这就是用来压缩主页上捆绑的数据+库文件的输出的方法