JavaScript检查时区名称是否有效

Pra*_*A.K 7 javascript timezone timezone-offset

有没有办法在不使用外部库的情况下检查JavaScript中的时区名称是否有效?

当用户在文本字段中输入时区名称时,我想验证区域是否有效?

我知道我们可以使用moment-timezone库轻松完成.但我不想使用任何额外的库.我正在寻找纯粹的JavaScript方式.

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

isValidTimeZone('Asia/Colombo'); //returns true
isValidTimeZone('America/Los_Angeles'); //returns true
isValidTimeZone('MyTimeZone/ME'); //returns false
Run Code Online (Sandbox Code Playgroud)

Mat*_*int 17

在ECMA-402(ECMAScript Internationalization API)中完全支持IANA时区标识符的环境中,您可以尝试在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
Run Code Online (Sandbox Code Playgroud)

如果您无法确定自己的环境,那么最好的方法就是使用时刻

!!moment.tz.zone('America/Los_Angeles') // true
!!moment.tz.zone('Foo/Bar') // false
Run Code Online (Sandbox Code Playgroud)

当然,你总是可以提取你自己的时区名称数组(也许用moment.tz.names()它来测试它.


小智 9

我采用了Matt Johnson-Pin 解决方案,在编写单元测试后,我发现是否可以通过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
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,谢谢我在生产中使用它。


小智 8

在打字稿中,您也可以以更清洁的方式进行

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

你还需要导入

import moment = require("moment-timezone");
Run Code Online (Sandbox Code Playgroud)