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;
}
}
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);
}
# 1 楼答案
我的项目中的一些修改过的代码也有类似的要求。我们有自己的历史时区格式,所以不能使用标准库
您可能会争辩说,在配置中使用映射比在代码中使用映射更好——可能是在属性文件中。这可能是真的,但请记住实用主义程序员的规则“你不需要它”
# 2 楼答案
我不知道是否有一种简单的方法可以将3个字母的版本转换为2个字母的版本,但在更糟糕的情况下,您可以创建它们的映射,如下所示:
现在,您可以使用
localeMap.get("eng")
之类的东西查找区域设置编辑:修改地图的创建方式。现在每种语言应该有一个对象
编辑2:已经有一段时间了,但是在初始化映射时更改了代码以使用语言数组的实际长度
# 3 楼答案
您可以使用构造函数
Locale(String language)
,其中语言是两个字母的ISO-639-1代码。我认为将ISO-639-2转换为ISO-639-1的最简单方法是创建HashMap<String,String>
常量