JavaScript 检查时区名称是不是有效

Posted

技术标签:

【中文标题】JavaScript 检查时区名称是不是有效【英文标题】:JavaScript check if timezone name valid or notJavaScript 检查时区名称是否有效 【发布时间】:2017-10-22 06:39:41 【问题描述】:

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

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

我知道我们可以使用时刻时区库轻松做到这一点。但我不想使用任何额外的库。我正在寻找纯 JavaScript 方式。

isValidTimeZone(name) 
//return true/false  


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

【问题讨论】:

根据友好的位置名称(如您在问题中显示的那样),时区被视为无效,它们根据时区偏移量有效。 ***.com/questions/22609927/… 用户输入时区名称(例如:亚洲/科伦坡)。稍后我需要在 Highcharts 中使用它。所以需要验证这一点。用户不会输入 +05:30。 是什么让时区对您有效? America/Anaheim 有效吗?因为我不认为你的意思是“大陆/城市名称”格式的任何东西都是自动有效的。你必须有一些数据库来测试。 您想自己维护this data吗?为了避免使用图书馆,似乎很麻烦。 它们不仅仅是“友好”的名称,它们是 tz 数据库中的标识符。名单在这里:en.wikipedia.org/wiki/List_of_tz_database_time_zones 【参考方案1】:

在完全支持 ECMA-402(ECMAScript 国际化 API)中的 IANA 时区标识符的环境中,您可以尝试在 DateTimeFormat(或 toLocaleString 的选项中)使用时区,它会抛出一个如果它不是有效的时区,则异常。您可以使用它来测试有效性,但只能在支持它的环境中使用。

function isValidTimeZone(tz) 
    if (!Intl || !Intl.DateTimeFormat().resolvedOptions().timeZone) 
        throw new Error('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() 并针对它进行测试。

【讨论】:

【参考方案2】:

在打字稿中你也可以用更简洁的方式来做

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

你还需要导入

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

【讨论】:

以上是关于JavaScript 检查时区名称是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是是有效的 XML 元素名称?

在javascript中检查日期是不是有效[重复]

如何检查 JavaScript 数字是不是是真实有效的数字?

如何在 JavaScript 中获取时区名称?

如何在JavaScript中获取时区名称?

检查未知对象中的对象是不是存在的最有效的Javascript方法[重复]