有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    我的项目中的一些修改过的代码也有类似的要求。我们有自己的历史时区格式,所以不能使用标准库

    public class MyProjectTimeZoneFactory  {
    
       private static Map timeZoneDb;
    
       /**
       * Set up our timezone id mappings; call this from any constructor
       * or static method that needs it.
       */
       private static void init() {
          if(null == TimeZoneDb) {
             timeZoneDb = new HashMap();   // Maybe a TreeMap would be more appropriate
             timeZoneDb.put("     ","GMT+00");
             timeZoneDb.put("EAD  ","GMT+10");
             timeZoneDb.put("JST  ","GMT+9");
             // etc.
           }
       }
    
       public static TimeZone getTimeZone(String id) 
                              throws CommandFormatException {
           init();
    
           TimeZone tz;
           if(timeZoneDb.containsKey(id)) {
               tz = TimeZone.getTimeZone((String)timeZoneDb.get(id));
           } else {
               throw new CommandFormatException("Invalid Timezone value");
           }
    
           return tz;
       }
    
     }
    

    您可能会争辩说,在配置中使用映射比在代码中使用映射更好——可能是在属性文件中。这可能是真的,但请记住实用主义程序员的规则“你不需要它”

  2. # 2 楼答案

    我不知道是否有一种简单的方法可以将3个字母的版本转换为2个字母的版本,但在更糟糕的情况下,您可以创建它们的映射,如下所示:

    String[] languages = Locale.getISOLanguages();
    Map<String, Locale> localeMap = new HashMap<String, Locale>(languages.length);
    for (String language : languages) {
        Locale locale = new Locale(language);
        localeMap.put(locale.getISO3Language(), locale);
    }
    

    现在,您可以使用localeMap.get("eng")之类的东西查找区域设置

    编辑:修改地图的创建方式。现在每种语言应该有一个对象

    编辑2:已经有一段时间了,但是在初始化映射时更改了代码以使用语言数组的实际长度

  3. # 3 楼答案

    您可以使用构造函数Locale(String language),其中语言是两个字母的ISO-639-1代码。我认为将ISO-639-2转换为ISO-639-1的最简单方法是创建HashMap<String,String>常量