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

Java 从区域设置获取正确的日期格式和时间格式,java,locale,jodatime,Java,Locale,Jodatime,我想实现以下场景: 从我的JSF页面获取区域设置 现在,我想保存数据库中区域设置的日期格式。 例如: 地区=美国 =>String dateformat=“YYYY-MM-dd” 但是如何从区域设置获取正确的日期格式 我应该需要同样的东西: 正确的时间格式 时区 谁能举个例子吗? 我已经看到一个库(jodaTime) 但是,我怎样才能做到这一点呢?第一句话:对于任何给定的区域,通常没有唯一的日期或时间格式,因为你还需要考虑例如精度问题,即风格。例如,在美国,你可以写出“一月”或“一月”或一个

我想实现以下场景: 从我的JSF页面获取区域设置

现在,我想保存数据库中区域设置的日期格式。
例如:

地区=美国
=>
String dateformat=“YYYY-MM-dd”

但是如何从
区域设置
获取正确的
日期格式

我应该需要同样的东西:

  • 正确的时间格式
  • 时区
谁能举个例子吗? 我已经看到一个库(jodaTime)
但是,我怎样才能做到这一点呢?

第一句话:对于任何给定的区域,通常没有唯一的日期或时间格式,因为你还需要考虑例如精度问题,即风格。例如,在美国,你可以写出“一月”或“一月”或一个数字(这里至少有两个变体,要么是“01”,要么只是“1”)

对问题a的回答):但是确实有一种方法可以提取给定区域设置的公共模式。这里是
SimpleDataFormat
的方法(JodaTime内部使用相同的方法):

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

对问题c的回答):时区概念与本地化无关。例如,美国或俄罗斯有几个时区。反过来,至少在概念上,IANA-TZDB不排除在一个时区中有多个地区。例如,“欧洲/圣马力诺”只是“欧洲/罗马”的一个链接/别名,也就是说,它不是一个拥有自己数据的独立时区标识符。但至少为了帮助用户选择正确的时区,提供了内置于tzdb所有发行版中的查找表:


不幸的是,Java并没有为这个表提供标准的API访问,甚至连新的(in)表也没有,所以要自己评估zone.tab表。这可能是一种更好的方法,可以根据用户的偏好直接从用户那里获取正确的时区。例如,在基于web的场景中,JavaScript提供了提取这些信息的解决方案,然后将其发送到服务器,您的Java程序可以在服务器上处理这些信息。参见此。

请注意:您的示例模式“yyy-MM-dd”不是特定于美国的模式,甚至不是特定于ISO的模式。Y代表工作日的年份(分别以周为基础的年份),应该与一年中的一周和一周中的一天结合起来形成一周的日期。你的意思可能是“yyyy-MM-dd”。但这也不是针对美国的。在美国,通常先设置月份信息。
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
}