如何从Java语言环境的时区获取日期模式

如何从Java语言环境的时区获取日期模式,java,date,timezone,locale,Java,Date,Timezone,Locale,我有一个时区和用户的区域设置。现在我想知道日期模式 例如:用户的时区PST和地区US,我期望的模式是“MM/dd/yyyy”,如果用户的时区是IST和地区India,那么我期望的模式是“dd/MM/yyyy” 如何得到这个 注意:我想得到的是模式而不是实际日期,这样我可以在其他地方使用它。你真的需要日期模式的TZ吗?通常的方法是在本地化属性文件中为区域设置(或区域设置\国家/地区)设置数据模式。我认为这就足够了。将Locale转换为日期/时间格式的逻辑隐藏在java.text.simpleDat

我有一个时区和用户的区域设置。现在我想知道日期模式

例如:用户的时区PST和地区US,我期望的模式是“MM/dd/yyyy”,如果用户的时区是IST和地区India,那么我期望的模式是“dd/MM/yyyy”

如何得到这个


注意:我想得到的是模式而不是实际日期,这样我可以在其他地方使用它。

你真的需要日期模式的TZ吗?通常的方法是在本地化属性文件中为区域设置(或区域设置\国家/地区)设置数据模式。我认为这就足够了。

Locale
转换为日期/时间格式的逻辑隐藏在
java.text.simpleDataFormat#simpleDataFormat
构造函数中,正是在
sun.util.resources.LocaleData#getDateFormatData
中。此方法提供
ResourceBundle
,然后根据选择的样式查询特定模式


换句话说——不幸的是,JDK似乎没有提供API/SPI来访问原始格式。我的建议是一直使用
区域设置
,并将其传递给格式化/解析方法。

听起来您希望使用即时格式。它们的样式(短、长等)采用整数常量,还可以选择不同的语言环境(而不是JVM的默认设置)。

您可以使用

k将是区域设置 如果您使用的是Joda Time,那么v将是一个带有日期模式的字符串(如果您有任何选择,为什么不呢?它几乎被捆绑到JDK 1.7中),您可以这样做:

String patternForStyleAndLocale = org.joda.time.format.DateTimeFormat.patternForStyle("S-", locale);
不幸的是,只有两位数的年份。解决这一问题的一个办法是:

if (!org.apache.commons.lang.StringUtils.contains(patternForStyleAndLocale, "yyyy"))
{
    // The default Joda pattern only has a two digit year for US and Europe, China etc - but we want four digit years
    patternForStyleAndLocale = StringUtils.replace(patternForStyleAndLocale, "yy", "yyyy");
}

你可以考虑在<代码> CONCURNESHASMAP中缓存它们。< /P> 将数字日期作为预本地化模式获取的好处是,它不需要以后进行任何进一步的本地化,如果您使用的模式如下:

"dd MMM yyyy" // UK: "25 Dec 2010" FRANCE: "25 déc. 2010" etc..
然而。。。我刚刚从您稍后的评论中注意到,您希望将模式传递给JavaScript—这可能会变得非常困难,因为JS对Java使用不同的模式格式(例如,ISO日期在Java中是
“yyyy-MM-dd”
,在JS中是
“yy-MM-dd”
)。我没有尝试解决这个问题,但我可能会在JS或Java中使用一些字符串映射来简单地从Java模式映射到JS。当然,您必须事先了解每种语言可能遇到的每种模式。

java.time 现代解决方案使用多年前的java.time类取代了糟糕的遗留类,如
SimpleDateFormat
。具体地被替换为

跳过格式化模式,让java.time自动本地化 你问:

我有一个时区和用户的区域设置。现在我想知道日期模式

不需要实际获取特定区域设置使用的格式模式

上的
.ofLocalized…
方法返回一个格式化程序对象,该对象可以自动本地化表示日期时间对象值的文本。因此,您不需要查看模式,只需要请求生成的文本结果

对象控制文本的长度或缩写。语言决定了本地化时使用的人类语言和文化规范

ZoneId z=ZoneId.of(“亚洲/东京”);
ZonedDateTime zdt=ZonedDateTime.now(z);
语言环境=Locale.CANADA\u法语;
DateTimeFormatter f=
日期时间格式化程序
.OfCalizedDateTime(FormatStyle.FULL)
.withLocale(区域设置)
;
字符串输出=zdt.格式(f);
转储到控制台

System.out.println(zdt.toInstant().toString());//调整到UTC。
System.out.println(zdt.toString());//生成标准ISO 8601格式的文本,并将其明智地扩展,以便将时区名称附加到方括号中。
System.out.println(输出);//自动格式化的内容。
看这个

2020-07-13T23:26:40.554180Z

2020-07-14T08:26:40.554180+09:00[亚洲/东京]

mardi 14 juillet 2020年08时26分40秒日本天气正常


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • 带来了一些小功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • Android(26+)的更高版本捆绑了java.time类的实现

    • 对于早期的Android(为什么不在“this other place”中使用区域设置,而不仅仅是模式?嗨,Petal Ivanov,实际上,我想将模式传递给Javascript,这样我就不能使用区域设置了。+1用于将区域设置传递给您自己的格式化方法,这是一个非常灵活的解决方案,我不需要TZ用于日期模式。但一般来说,这就是我手头上的内容(用户的时区详细信息)。“通常的方法是在本地化属性文件中为区域设置(或区域设置\国家/地区)设置数据模式”-这是否意味着,最好的方法是在国家/地区级别维护日期模式(并将其保存在数据库或文件系统中)?是的。无法从http请求中检索TZ,因此您只知道客户端的区域设置/国家/地区。另一种方法是要求用户TZ ans将其与其他用户信息一起保存在数据库中。