时刻时区文档

要使用矩时区,你需要moment@2.9.0+,moment-timezone.js和moment-timezone数据。

为方便起见,在momentjs.com.cn/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时间,因为这些时刻是在默认时区中创建的

Parsing in Zone

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

你可以在格式参数后面指定一个布尔值,以使用严格的解析。严格的解析要求格式和输入完全匹配,包括分隔符。.

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

Parsing Ambiguities

由于夏令时,有可能时间不存在或存在两次。

春天前进

在春天,在夏令时开始时,时钟向前移动一小时。但实际上,现在不是移动的时间,而是移动的偏移。

向前移动偏移给出了一小时消失的错觉。随着时间的推移,你可以看到它从1:58 一直 1: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

Formatting Additions

moment.tz(String).format("Z z"); // -08:00 PST
moment.tz(String).zoneAbbr();    // PST
moment.tz(String).zoneName();    // PST

除了包含+00:00格式信息外,Moment Timezone还包括缩写时区名称的信息。

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)

Default time zone

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对象或其克隆。

Guessing user zone

moment.tz.guess();
moment.tz.guess(Boolean);

Moment Timezone (Intl.DateTimeFormat().resolvedOptions().timeZone) 在 支持的浏览器中 使用Internationalization API()来确定用户的时区。

在其他浏览器上,时区检测相当棘手,因为这些浏览器提供的信息很少。对于这些,它将使用Date#getTimezoneOffset,并Date#toString围绕本年度时刻屈指可数收集关于浏览器环境中尽可能多的信息。然后,它将该信息与加载的所有时区数据进行比较,并返回最接近的匹配。如果是关系,则返回人口最多的城市的时区。

默认情况下,Moment Timezone会缓存检测到的时区。这意味着后续调用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
}

Name

zone.name; // America/Los_Angeles

唯一标识时区的名称。

Abbreviation

zone.abbr(timestamp); // PST

从a获取给定时间戳的缩写Zone.

moment.tz.zone('America/Los_Angeles').abbr(1403465838805); // PDT
moment.tz.zone('America/Los_Angeles').abbr(1388563200000); // PST

Offset

zone.utcOffset(timestamp); // 480

从a获取给定时间戳的偏移量Zone.

moment.tz.zone('America/Los_Angeles').utcOffset(1403465838805); // 420
moment.tz.zone('America/Los_Angeles').utcOffset(1388563200000); // 480

OSIX兼容性要求偏移被反转。因此,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/Madridindentifer应当用来代替Etc/GMT+1标识符。

Parse Offset

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

这是处理上面的Parsing Ambiguities 部分中引用的案例的代码 。

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

Moment Timezone使用两种数据格式。用于计算的解压缩版本和用于缩小传输的打包版本。

Unpacked Format

解压缩的格式看起来与区域对象完全相同。

以下数据是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该索引处。

大声朗读的一个简单方法是“在"between untils[n-1] 和之间 untils[n],abbr应该abbrs[n]和偏移应该是 offsets[n]".

请注意,untils以毫秒为单位offsets测量,以分钟为单位。

Packed Format

打包格式表示单个字符串中的解压缩区域。

以下数据适用于2014年至2018年之间的洛杉矶。这里可以看到更多时区

'America/Los_Angeles|PST PDT|80 70|01010101010|1Lzm0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0'

为了节省尽可能多的字节,我们使用非常紧凑的格式来存储数据。

数据分为5个部分,用管道分隔。

#TypeExample
0NameAmerica/Los_Angeles
1Abbr MapPST PDT
2Offset Map80 70
3Abbr/Offset Index01010101010
4Timestamp Diff1Lzm0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0

Name: 时区的规范名称。

Abbr Map: 此时区中使用的所有缩写的空格分隔列表。

Offset Map: 以60分为单位,在此时区中使用的所有偏移的空格分隔列表,以分钟为单位。

Abbr/Offset Index: 偏移和abbr映射中紧密排列的索引数组。这些也在基地60。

Timestamp Diffs: 这是存储时间戳的位置。

因为我们正在处理时间戳的排序列表,所以我们只存储上一个时间戳的差异,而不是存储完整的时间戳。

数组中的第一项是以分钟为单位的unix时间戳。第一个项目之后的所有项目都是在解包期间要添加到先前值的分钟数。所有物品都存放在底座60中。

正如您在上面的示例中看到的那样,时间戳差异往往会每年复制相同的值。与我们使用完整时间戳相比,这些重复允许gzip进一步压缩数据。

Base 60?

Y您可能想知道为什么使用base 60。Base 62是用于ascii数据压缩的相当常用的工具,a-z用于表示10-35A-Z表示36-61.

虽然它可能已经节省了几个字节来使用base 62,但Moment Timezone中的大部分数据很好地映射到60的倍数。

一小时60分钟,一分钟60秒。3小时是30在底座60和分钟300秒在基座60,而不是18010800 在基座10或2U2Oc在基座62。

Link Format

为了减少重复,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。

Adding a Zone

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-timezone source for up to date data.

Adding a Link

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'
]);

Loading a Data Bundle

moment.tz.load({
    zones : [],
    links : [],
    version : '2014e'
});

Moment Timezone的数据来自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 : [...]
})

Checking Zone Existence

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", ...}

Getting Zone Names

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

Pack

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"

Unpack

moment.tz.unpack(PackedString); // UnpackedObject

这会将打包格式的数据转换 to the 为解压缩格式。.

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]
// };

Pack Base 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.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

Unpack Base 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

Create Links

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,因为旧的规则可以区分两个区域可能不在过滤年份范围内,允许它们链接以节省空间。

Filter Years

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

Filter Years, Create Links, and Pack

moment.tz.filterLinkPack(UnpackedBundle, Number, Number); // PackedBundle

包装,链接创建和年份子集都是压缩要传输到客户端的数据的工具。

moment.tz.filterLinkPack方法将所有这些组合成一个简单的界面。传递一个解压缩的包,开始年份和结束年份,并获得一个过滤的,链接的,打包的包。

这是用于压缩主页上捆绑数据+库文件的输出的内容。