从区域设置中获取正确的日期格式和时间格式

时间:2014-01-29 14:44:16

标签: java locale jodatime

我想实现以下方案: 从我的JSF页面获取Locale。

现在我想从我的数据库中的语言环境中保存日期格式 示例:

locale = US
=> String dateformat = "YYYY-MM-dd"

但是如何从Dateformat获取正确的Locale

我需要同样的事情:

  • 正确的Timeformat
  • 时区

有人可以举个例子吗? 我已经看到了一个图书馆(jodaTime) 但是我怎么能这样做呢?

1 个答案:

答案 0 :(得分:1)

第一句话:对于任何给定的语言环境,通常没有唯一的日期或时间格式,因为您还必须考虑例如精度问题,即样式。例如在美国,您可以写出“1月”或“1月”或数字(此处至少有两个变体“01”或“1”)。

回答问题a):但确实有一种方法可以提取给定语言环境的常见模式。这里SimpleDateFormat的方式(JodaTime内部使用相同的方式):

static String getDateFormat(int style, Locale locale) {
  DateFormat fmt = DateFormat.getDateInstance(style, locale);

  if (fmt instanceof SimpleDateFormat) { // almost always true
    return ((SimpleDateFormat) fmt).toPattern(); 
  } else {
    throw new UnsupportedOperationException("Cannot get date pattern for: " + locale);
  }
}

public static void main(String... args) {
  System.out.println(getDateFormat(DateFormat.SHORT, Locale.US);
  // Output: M/d/yy
}

回答问题b):要获得时间模式非常相似,只需研究java.text.DateFormat的javadoc,尤其是方法getTimeInstance(int, Locale)

回答问题c):时区概念与本地化无关。例如,美国或俄罗斯有几个时区。反之,至少从概念上讲,IANA-TZDB并不排除在一个时区中拥有多个区域设置。例如,“Europe / San_Marino”只是/“欧洲/罗马”的链接/别名,即不是具有其自己数据的独立时区标识符。但至少为了帮助用户选择正确的时区,IANA-TZDB提供了这个查找表,该表内置于tzdb的所有发行版中:

https://github.com/eggert/tz/blob/master/zone.tab

不幸的是,Java不为此表提供标准API访问权限,甚至不提供新的JSR-310java.time.*中的Java 8)或Joda-Time,因此由您自己决定自己评估zone.tab-table。这可能是您根据自己的偏好直接从用户获得正确时区的更好方式。例如,在基于Web的场景中,JavaScript提供解压缩来提取此信息,然后将其发送到Java程序可以处理的服务器。请参阅此SO-answer