java.time.ZoneId是否有原因不包括ZoneIds的枚举?

时间:2017-06-30 00:40:28

标签: java java-8 timezone java-time

要获得<Container> <Address></Address> <DisplayName>This is the text we are looking for</DisplayName> <Phone>888-888-8888</Phone> <UrlName>Really want this text</UrlName> </Container> <Container> <Address></Address> <DisplayName>This is the text we dont want</DisplayName> <Phone>888-888-8888</Phone> <UrlName>Not Interested</UrlName> </Container> ,它就像:

// h1 = This is the text we are looking for
var h1 = document.querySelector("h1").textContent;

$.ajax({

    type: "GET",
    url: "http://www.example.com/api",
    dataType: "xml",

    success: function(xml){
        var container = $(xml).find('Container').find('DisplayName');
        var urlName = $(container).find(h1).closest('Container').find('UrlName').text();
        console.log(urlName);
    },

    error: function() {
        console.log("error");
    }

});

ZoneId

为什么不存在ZoneId.of("America/Sao_Paulo"); 这样的值,例如:

ZoneId.of(ZoneId.SHORT_IDS.get("BET"));

这似乎不容易出错,而且更加自动完成友好?

3 个答案:

答案 0 :(得分:14)

我相信它是因为无论Java版本如何,所有可能的时区名称列表都会发生变化。

时区信息comes with Java installation(通常位于文件夹<java-home>/lib/zi或新版本的jre/lib/tzdb.dat文件中)。但是这些信息可以在不更改Java版本的情况下进行更新(使用Timezone Updater Tool)。

如果更新了时区数据(但Java版本保持不变)并且创建了新的区域ID,则不会有相应的Enum,而API&#34;不完整&#34;。时区数据changes faster than JDK updates - 即使它没有,但我们并不总是能够在生产环境中更新JDK版本。

我不能代表API创建者,但我认为他们决定让它保持原样,因为命名空间的增长速度可能比更新JDK的速度快,并且保持枚举的最新状态将是无休止的,总是不完整的工作。

如果您确实想检查时区名称是否有效,可以执行以下操作:

if (ZoneId.getAvailableZoneIds().contains("America/Sao_Paulo")) {
    // America/Sao_Paulo is a valid ID
}

或者只需致电ZoneId.of("zone-name")并抓住ZoneRulesException

我刚刚在 JDK 1.8.0_131 中调用了ZoneId.getAvailableZoneIds(),它有600个条目。可能没有人想创建600枚枚举常量。

有人可能会争辩说,他们可以做类似于java.util.Locale类的事情,它有一些语言的条目(如英语,德语,法语等)。但是如何决定哪些时区&#34;值得拥有&#34;一个常数?也许他们只是决定不考虑太多,&#34;嘿,忘掉它,只需使用带有区域名称的String&#34;

另一个可能的原因可能是ZoneId.of()方法还设计为接收UTC偏移(例如+05:00-0300+09:30:15等等。由于偏移量接受小时,分钟和秒,因此有数百种可能的偏移量,并且为每个偏移量创建枚举将是不切实际的。

再次,人们可以争辩&#34;嘿,只创建名称的枚举并忘记偏移&#34; 。但是上面已经讨论了不创建枚举名称的可能的原因。

答案 1 :(得分:6)

JDK中的时区集合可以是completely replaced。  因此,无法为区域定义enum

此外,时区标识符相对不稳定。它们被重命名,合并并且通常会更改。 (包括我在内的各种人都试图在IANA数据库中获得更多稳定性,但数据库维护者并不同意。)

将考虑在提供常量的ThreeTen-Extra中创建ZoneIds类的拉取请求。

答案 2 :(得分:4)

如果您看到ZoneId#getAvailableZoneIds方法的说明,那么您知道为什么吗?

  

此集包括所有可用的基于区域的ID的字符串形式。返回集中的基于偏移的区域ID 不包括。可以将ID传递给of(String)以创建ZoneId。

     

区域ID的集合可以随着时间的推移增加,但在典型的应用程序中,ID的集合是固定的。每次调用此方法都是线程安全的。