Java 时区自定义显示名称

Java 时区自定义显示名称,java,timezone,Java,Timezone,我需要一个时区显示值,如下所示: (UTC + 05:30) Chennai, Kolkata, Mumbai, New Delhi 但是通过使用下面的方法,我得到了稍微不同的输出。如何获取上述时区显示名称?(如果需要,我可以使用JODA) 公共类时区{ 专用静态最终字符串时区\u ID\u前缀= “^(非洲|美洲|亚洲|大西洋|澳大利亚|欧洲|印度|太平洋)/.*”; 私有静态列表时区; 公共静态列表getTimeZones(){ 如果(时区==null){ 时区=新的ArrayList()

我需要一个时区显示值,如下所示:

(UTC + 05:30) Chennai, Kolkata, Mumbai, New Delhi
但是通过使用下面的方法,我得到了稍微不同的输出。如何获取上述时区显示名称?(如果需要,我可以使用JODA)

公共类时区{
专用静态最终字符串时区\u ID\u前缀=
“^(非洲|美洲|亚洲|大西洋|澳大利亚|欧洲|印度|太平洋)/.*”;
私有静态列表时区;
公共静态列表getTimeZones(){
如果(时区==null){
时区=新的ArrayList();
最后一个字符串[]timeZoneIds=TimeZone.getAvailableIDs();
for(最终字符串id:TimeZoneID){
if(id.matches(时区\u id\u前缀)){
添加(TimeZone.getTimeZone(id));
}
}
Collections.sort(时区、新比较器(){
公共整数比较(最终时区t1,最终时区t2){
返回t1.getID().compareTo(t2.getID());
}
});
}
返回时区;
}
公共静态字符串getName(时区时区){
返回timeZone.getID().replaceAll(““,”)+“-”+timeZone.getDisplayName();
}
公共静态void main(字符串[]args){
时区=getTimeZones();
用于(时区时区:时区){
System.out.println(getName(timeZone));
}
}
}

此代码可能会为您带来以下好处:

public static void main(String[] args) {

    for (String timeZoneId: TimeZone.getAvailableIDs()) {
        TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);

        // Filter out timezone IDs such as "GMT+3"; more thorough filtering is required though
        if (!timeZoneId.matches(".*/.*")) {
            continue;
        }

        String region = timeZoneId.replaceAll(".*/", "").replaceAll("_", " ");
        int hours = Math.abs(timeZone.getRawOffset()) / 3600000;
        int minutes = Math.abs(timeZone.getRawOffset() / 60000) % 60;
        String sign = timeZone.getRawOffset() >= 0 ? "+" : "-";

        String timeZonePretty = String.format("(UTC %s %02d:%02d) %s", sign, hours, minutes, region);
        System.out.println(timeZonePretty);
    }
}
输出如下所示:

(UTC+09:00)东京

然而,有几个警告:

  • 我只过滤出ID与格式“大陆/地区”(例如“美洲/纽约”)匹配的时区。不过,您必须执行更彻底的过滤过程,以消除输出,例如
    (UTC-08:00)GMT+8

  • 您应该阅读文档,了解它在做什么。例如,它没有考虑DST效应

  • 总的来说,您应该知道这是一种混乱的方法,主要是因为时区ID可以有很多不同的格式。也许您可以将自己限制在对您的应用程序有影响的时区内,只需将时区ID的键值映射到显示名称即可


我不完全清楚您希望如何构造所需的输出。是否希望UTC偏移量后跟一个城市?或者后跟该时区中的所有城市?UTC偏移量后跟一个城市或时区即可。。。
public static void main(String[] args) {

    for (String timeZoneId: TimeZone.getAvailableIDs()) {
        TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);

        // Filter out timezone IDs such as "GMT+3"; more thorough filtering is required though
        if (!timeZoneId.matches(".*/.*")) {
            continue;
        }

        String region = timeZoneId.replaceAll(".*/", "").replaceAll("_", " ");
        int hours = Math.abs(timeZone.getRawOffset()) / 3600000;
        int minutes = Math.abs(timeZone.getRawOffset() / 60000) % 60;
        String sign = timeZone.getRawOffset() >= 0 ? "+" : "-";

        String timeZonePretty = String.format("(UTC %s %02d:%02d) %s", sign, hours, minutes, region);
        System.out.println(timeZonePretty);
    }
}