【问题标题】:How to get the list of all available timezone using moment-timezone如何使用时刻时区获取所有可用时区的列表
【发布时间】:2016-10-25 18:11:24
【问题描述】:

我正在尝试在节点 js 中使用 moment-timezone 获取所有可用时区的列表 -

var moment = require('moment-timezone');
var timeZones = moment.tz.names();
console.log(timeZones);

我正在以这种格式获取时区 -

'Europe/Mariehamn',
'Europe/Minsk',
'Europe/Monaco',
'Europe/Moscow',
'Europe/Nicosia',
'Europe/Oslo',
'Europe/Paris',
'Europe/Podgorica',
'Europe/Prague',
'Europe/Riga',
'Europe/Rome',

但我想以这种格式获取时区 -

(GMT +01:00) Africa/Brazzaville
(GMT +01:00) Africa/Casablanca
(GMT +01:00) Africa/Douala
(GMT +01:00) Africa/El_Aaiun
(GMT +01:00) Africa/Kinshasa
(GMT +01:00) Africa/Lagos
(GMT +01:00) Africa/Libreville
(GMT +01:00) Africa/Luanda
(GMT +01:00) Africa/Malabo
(GMT +01:00) Africa/Ndjamena
(GMT +01:00) Africa/Niamey

我如何获得?

【问题讨论】:

  • 您要显示哪个偏移量?本年度的标准偏移量? 当前 偏移量(可能是也可能不是标准偏移量),在特定时间点生效的偏移量?列表将在您的应用程序中执行什么功能?

标签: timezone momentjs


【解决方案1】:

没有直接从moment-timezone 获取所需格式的直接方法。

尝试如下。

var moment = require('moment-timezone');
var timeZones = moment.tz.names();
var offsetTmz=[];

for(var i in timeZones)
{
    offsetTmz.push(" (GMT"+moment.tz(timeZones[i]).format('Z')+") " + timeZones[i]);
}

现在,offsetTmz 是您想要的格式的字符串数组。

这就是我使用它的方式。

希望这会对你有所帮助。

【讨论】:

  • 请注意,这将为您现在提供偏移量。这可能不是标准时间的偏移量。它会在遵守 DST 的任何时区发生变化。
【解决方案2】:

基于the answer by Erez Libermanthe answer by Matt Johnson about trimming the list 我想将我的添加为一个完整的Typescript 类,以相反的顺序对具有负偏移的时区进行排序

import * as moment from 'moment-timezone';

export class TimezoneData {
    tzName: string;
    tzPresentationName: string;
}

export class TimezoneUtils {

    public static getTimezonesNames(): TimezoneData[] {
        const arr: TimezoneData[] = [];
        const names = moment.tz.names();
        for (const name of names) {
            if ((name.indexOf('/') < 0 && name !== 'UTC') || name.startsWith('Etc/')) {
                continue;
            }
            const data = new TimezoneData();
            data.tzName = name;
            data.tzPresentationName = moment.tz(name).format('Z');
            arr.push(data);
        }
        arr.sort((a, b) => {
            if (a.tzPresentationName === b.tzPresentationName) {
                if (a.tzName === 'UTC') {
                    return -1;
                }
                return a.tzName === b.tzName ? 0 : (a.tzName > b.tzName ? 1 : -1);
            }
            const afc = a.tzPresentationName.charAt(0);
            const bfc = b.tzPresentationName.charAt(0);
            if (afc === '-') {
                if (bfc === '+') {
                    return -1;
                }
                return a.tzPresentationName > b.tzPresentationName ? -1 : 1;
            }
            if (bfc === '-') {
                return 1;
            }
            return a.tzPresentationName > b.tzPresentationName ? 1 : -1;
        });
        arr.forEach(a => a.tzPresentationName = `${a.tzName} (GMT ${a.tzPresentationName})`);
        return arr;
    }
}

【讨论】:

    【解决方案3】:

    基于@Shrabanee 的回答并根据@Tenz 评论 - 这是我使用 es6 模板文字并按 GMT + 数字而不是时区名称对列表进行排序的解决方案:

        timeZones = momentTimezone.tz.names();
        let offsetTmz=[];
    
        for(let i in timeZones)
        {
            offsetTmz.push(`(GMT${moment.tz(timeZones[i]).format('Z')}) ${timeZones[i]}`);
        }
    
        this.timeZoneNames = offsetTmz.sort();
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多