JavaScript проверяет правильность имени часового пояса или нет

Есть ли способ проверить, является ли имя часового пояса действительным или нет в JavaScript без использования внешней библиотеки?

Когда пользователь вводит имя часового пояса в текстовое поле, я хочу проверить, является ли зона действительной или нет?

Я знаю, что мы можем сделать это легко, используя библиотеку моментов и часовых поясов. Но я не хочу использовать дополнительную библиотеку. Я ищу чистый способ JavaScript.

isValidTimeZone(name) {
//return true/false  
}

isValidTimeZone('Asia/Colombo'); //returns true
isValidTimeZone('America/Los_Angeles'); //returns true
isValidTimeZone('MyTimeZone/ME'); //returns false

3 ответа

Решение

В средах, которые полностью поддерживают идентификаторы часовых поясов IANA в ECMA-402 (Интернационализация API ECMAScript), вы можете попробовать использовать часовой пояс в DateTimeFormat (или в опциях toLocaleString) и он выдаст исключение, если он не является действительным часовым поясом. Вы можете использовать это для проверки действительности, но только в средах, где это поддерживается.

function isValidTimeZone(tz) {
    if (!Intl || !Intl.DateTimeFormat().resolvedOptions().timeZone) {
        throw 'Time zones are not available in this environment';
    }

    try {
        Intl.DateTimeFormat(undefined, {timeZone: tz});
        return true;
    }
    catch (ex) {
        return false;
    }
}

// Usage:
isValidTimeZone('America/Los_Angeles') // true
isValidTimeZone('Foo/Bar') // false

Если вы не можете быть уверены в своем окружении, то лучший способ будет с моментом времени

!!moment.tz.zone('America/Los_Angeles') // true
!!moment.tz.zone('Foo/Bar') // false

Конечно, вы всегда можете извлечь свой собственный массив имен часовых поясов (возможно, с moment.tz.names() и проверить против этого.

В машинописном тексте вы также можете сделать более чистый способ

    public static isValidTimezone(timezone: string): boolean {
            return moment.tz.zone(timezone) != null;
        }

вам также необходимо импортировать

import moment = require("moment-timezone");

Я взял решение Мэтта Джонсона-Пина , после написания модульных тестов я нашел, пройти лиundefinedфункция возвращаетtrue. Итак, я сделал небольшое обновление:

      export const isValidTimeZone = (tz: unknown): boolean => {
    try {
        if (!Intl || !Intl.DateTimeFormat().resolvedOptions().timeZone) {
            return false
        }

        if (typeof tz !== 'string') {
            return false
        }

        // throws an error if timezone is not valid
        Intl.DateTimeFormat(undefined, { timeZone: tz })
        return true
    } catch (error) {
        return false
    }
}

В любом случае спасибо, я использую это в производстве.

Другие вопросы по тегам