SimpleDateFormat 和基于区域设置的格式字符串
我正在尝试根据给定的区域设置以不同的方式格式化 Java 中的日期。例如,我希望英语用户看到“Nov 1, 2009”(格式为“MMM d, yyyy”),挪威用户看到“1. nov. 2009”(“d. MMM.yyyy”)。
如果我将区域设置添加到 SimpleDateFormat 构造函数中,月份部分就可以正常工作,但是其余部分呢?
我希望可以将与区域设置配对的格式字符串添加到 SimpleDateFormat,但我找不到任何方法来做到这一点。是否可能或者我需要让我的代码检查区域设置并添加相应的格式字符串?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
使用 DateFormat.getDateInstance(int style, Locale locale) 而不是使用
SimpleDateFormat
创建您自己的模式。Use DateFormat.getDateInstance(int style, Locale locale) instead of creating your own patterns with
SimpleDateFormat
.使用样式 + 区域设置:DateFormat.getDateInstance(int style, Locale locale)
检查http://java.sun.com/j2se/1.5.0/docs/api/java/text/DateFormat.html
运行以下示例以查看差异:
输出:
Use the style + locale: DateFormat.getDateInstance(int style, Locale locale)
Check http://java.sun.com/j2se/1.5.0/docs/api/java/text/DateFormat.html
Run the following example to see the differences:
Output:
tl;dr
麻烦的
java.util.Date
和SimpleDateFormat
类现在已经被遗留下来,被 java.time 类取代。LocalDate
LocalDate
类表示仅日期值,没有时间和时区。时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,但仍然是“昨天” ”在魁北克省蒙特利尔。
DateTimeFormatter
使用
DateTimeFormatter
生成表示仅日期部分或时间部分。DateTimeFormatter
类可以自动本地化。要本地化,请指定:
FormatStyle
来确定字符串的长度或缩写。
区域设置
到确定(a)用于翻译日名、月名等的人类语言,以及(b)决定缩写、大写、标点符号等问题的文化规范。示例:
换个方向,您可以解析本地化字符串。
请注意,语言环境和时区是完全正交的问题。您可以用日语呈现蒙特利尔时刻,也可以用印地语呈现新西兰奥克兰时刻。
另一个示例:将
6 junio 2012
(西班牙语)更改为2012-06-06
(标准 ISO 8601 格式)。 java.time 类默认使用 ISO 8601 格式来解析/生成字符串。仔细阅读格式
下面是一些示例代码,用于在多个语言环境中仔细阅读多种格式的结果,并自动本地化。
EnumSet
是Set
< 的实现/a>,在收集Enum
对象。因此,EnumSet.allOf( FormatStyle.class )
为我们提供了所有四个FormatStyle
要循环的枚举对象。有关详细信息,请参阅有关枚举类型的 Oracle 教程。输出。
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
java.util.Date
,日历
,&SimpleDateFormat
。Joda-Time 项目,现已在 维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程 。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
您可以直接与数据库交换java.time对象。使用符合 JDBC 驱动程序 jeps/170" rel="noreferrer">JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如
Interval
,YearWeek
,YearQuarter
,以及更多。tl;dr
The troublesome classes of
java.util.Date
andSimpleDateFormat
are now legacy, supplanted by the java.time classes.LocalDate
The
LocalDate
class represents a date-only value without time-of-day and without time zone.A time zone is crucial in determining a date. For any given moment, the date varies around the globe by zone. For example, a few minutes after midnight in Paris France is a new day while still “yesterday” in Montréal Québec.
DateTimeFormatter
Use
DateTimeFormatter
to generate strings representing only the date-portion or the time-portion.The
DateTimeFormatter
class can automatically localize.To localize, specify:
FormatStyle
to determine how long or abbreviated should the string be.Locale
to determine (a) the human language for translation of name of day, name of month, and such, and (b) the cultural norms deciding issues of abbreviation, capitalization, punctuation, and such.Example:
Going the other direction, you can parse a localized string.
Note that the locale and time zone are completely orthogonal issues. You can have a Montréal moment presented in Japanese language or an Auckland New Zealand moment presented in Hindi language.
Another example: Change
6 junio 2012
(Spanish) to2012-06-06
(standard ISO 8601 format). The java.time classes use ISO 8601 formats by default for parsing/generating strings.Peruse formats
Here is some example code for perusing the results of multiple formats in multiple locales, automatically localized.
An
EnumSet
is an implementation ofSet
, highly optimized for both low memory usage and fast execution speed when collectingEnum
objects. So,EnumSet.allOf( FormatStyle.class )
gives us a collection of all four of theFormatStyle
enum objects to loop. For more info, see Oracle Tutorial on enum types.Output.
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as
java.util.Date
,Calendar
, &SimpleDateFormat
.The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for
java.sql.*
classes.Where to obtain the java.time classes?
The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as
Interval
,YearWeek
,YearQuarter
, and more.日期字符串的本地化:
基于 redsonic 的帖子:
将类似于 05-九月-2013
Localization of date string:
Based on redsonic's post:
will be like 05-九月-2013
这将根据用户的当前区域设置显示日期:
要返回日期和时间:
Dec 31, 1969 7:00:02 PM
要仅返回日期,请使用:
Dec 31, 1969
This will display the date according to user's current locale:
To return date and time:
Dec 31, 1969 7:00:02 PM
To return date only, use:
Dec 31, 1969
给定日期的 Java 8 样式
Java 8 Style for a given date
希望这对某人有帮助。请在下面的代码中找到它接受 Locale 实例并返回区域设置特定的日期格式/模式。
Hope this helps someone. Please find in the below code which accepts Locale instance and returns the locale specific date format/pattern.
Java8
Java8