SimpleDateFormat 和基于区域设置的格式字符串
-
12-09-2019 - |
题
我正在尝试根据给定的区域设置以不同的方式格式化 Java 中的日期。例如,我希望英语用户看到“Nov 1, 2009”(格式为“MMM d, yyyy”),挪威用户看到“1.十一月2009”(“d.嗯。yyyy”)。
如果我将区域设置添加到 SimpleDateFormat 构造函数中,月份部分就可以正常工作,但是其余部分呢?
我希望可以将与区域设置配对的格式字符串添加到 SimpleDateFormat,但我找不到任何方法来做到这一点。是否可能或者我需要让我的代码检查区域设置并添加相应的格式字符串?
解决方案
使用 DateFormat.getDateInstance(int 样式, Locale 语言环境) 而不是创建自己的模式 SimpleDateFormat
.
其他提示
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);
使用的风格+区域设置强>: DateFormat.getDateInstance(INT风格,区域设置区域)
检查 HTTP://java.sun的.com / J2SE / 1.5.0 /文档/ API / JAVA /文本/ DateFormat.html
运行以下示例看到的差异:
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
public class DateFormatDemoSO {
public static void main(String args[]) {
int style = DateFormat.MEDIUM;
//Also try with style = DateFormat.FULL and DateFormat.SHORT
Date date = new Date();
DateFormat df;
df = DateFormat.getDateInstance(style, Locale.UK);
System.out.println("United Kingdom: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.US);
System.out.println("USA: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.FRANCE);
System.out.println("France: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.ITALY);
System.out.println("Italy: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.JAPAN);
System.out.println("Japan: " + df.format(date));
}
}
输出:
United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25
tl博士
LocalDate.now().format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
.withLocale( new Locale( "no" , "NO" ) )
)
麻烦类的 java.util.Date
和 SimpleDateFormat
现在的遗产,取代了通过java。时间课程。
LocalDate
的 LocalDate
类表示一个日期只有价值没有时间和没有时区。
一次区域至关重要的是在确定一个日期。对于任何给定的时刻,日期不同世界各地的区域。例如,几分钟后在午夜 巴黎法国 是新的一天,同时仍然"昨天"在 蒙特利尔魁北克.
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
使用 DateTimeFormatter
产生串仅占的日期或部分时间的部分。
的 DateTimeFormatter
类可以自动 本地化.
本地化,指定:
FormatStyle
确定如何长或缩写应串。Locale
来确定(a)人类的语言翻译的姓名,名个月,这样,和(b)的文化准则决定的问题的缩写、资本、标点符号等。
例如:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );
去另一个方向,可以分析本地化串。
LocalDate ld = LocalDate.parse( input , f );
注意到区域和次区是完全正交的问题。你可以有一个蒙特利尔时刻提出的在日本语言或新西兰奥克兰的时刻提出在印地语言。
另一个例子:改变 6 junio 2012
(西班牙), 2012-06-06
(标准 ISO8601 格式)。Java.时间类使用的ISO8601格式正在通过默认的用于解析/产生串。
String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString(); // 2012-06-06.
仔细阅读的格式
这里是一些例子码阅读的结果多种格式在多个选择,自动局部化。
一个 EnumSet
是一个实现的 Set
, 高度优化为低存储器的使用和快速执行的速度,当收集 Enum
对象。所以, EnumSet.allOf( FormatStyle.class )
给了我们一个集合的所有四个 FormatStyle
枚举的对象循环。更多信息,请参阅 Oracle教程在枚举的类型.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );
// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.
for ( Locale locale : locales )
{
System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() );
for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
{
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
String output = ld.format( f );
System.out.println( output );
}
System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );
输出。
------| LOCALE: fr_CA — French (Canada) |----------------------------------
mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23
------| LOCALE: no_NO — Norwegian (Norway) |----------------------------------
tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018
------| LOCALE: en_US — English (United States) |----------------------------------
Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18
« fin »
关于 java。时间
的 java。时间 框架是建立成Java8和后。这些类别取代的麻烦老 遗产 日间课程,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
的 乔达时 项目,现在 维护模式, 建议迁移到 java。时间 课程。
若要了解更多信息,请参见的 Oracle教程.和搜索堆溢出许多实例和解释。说明书 JSR310.
你可以交换 java。时间 对象直接用您的数据库。使用 JDBC驱动程序 符合 JDBC4.2 或者以后。没有必要为串,不需要 java.sql.*
课程。
在那里获得java。时间上课?
- Java SE8, Java SE9, 和之后
- 内置。
- 标准的一部分API与捆绑的执行情况。
- Java9中增加了一些次要设和修复。
- Java SE6 和 Java SE7
- 许多java。时间功能回来了-移植到Java6&7 ThreeTen-移植.
- 安卓
- 后来版本的安卓束实现java。时间课程。
- 早期, ThreeTenABP 项目适应 ThreeTen-移植 (所提到的上文)。看看 如何使用ThreeTenABP....
的 ThreeTen-额外的 项目的延伸java。时与附加课程。这个项目是一个试验场于今后可能增加java。时间。你可以找一些有用的类在这里 Interval
, YearWeek
, YearQuarter
, , 更多.
日期字符串的位置:
根据redsonic的讯息:
private String localizeDate(String inputdate, Locale locale) {
Date date = new Date();
SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
try {
date = dateFormat.parse(inputdate);
} catch (ParseException e) {
log.warn("Input date was not correct. Can not localize it.");
return inputdate;
}
return dateFormatCN.format(date);
}
String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));
会像05-九月-2013
这将根据用户的当前区域显示日期强>:
要返回的日期和时间:
import java.text.DateFormat;
import java.util.Date;
Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);
1969年12月31日下午7时○○分02秒
要返回日期只,使用:
DateFormat.getDateInstance()
1969年12月31日
String text = new SimpleDateFormat("E, MMM d, yyyy").format(date);
<强>爪哇8样式对于给定的日期强>
LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));
Java8
import java.time.format.DateTimeFormatter;
myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))