简而言之
您所期望的格式恰好在ISO 8601标准中定义。在解析/生成文本时,java.time类默认使用标准格式。
LocalDate.now().toString()
2019年1月23日
本地化为美国英语:
LocalDate
.now(
ZoneId.of( "America/Chicago" )
)
.format(
DateTimeFormatter.ofLocalizedDate(
FormatStyle.FULL
)
.withLocale(
new Locale( "en" , "US" )
)
)
对于突尼斯的阿拉伯语, 使用:
new Locale( "ar" , "TN" )
避免使用旧版日期时间类
您正在使用最早版本的Java捆绑的可怕日期时间类。随着JSR 310的采用,它们已被完全取代为java.time类。对于早期的Android,请参见下面的小圆点。
Locale
而Android没有Locale.Arabic格式
只有很少数的区域设置具有命名常量。学习通过标准语言代码和国家(文化)代码指定Locale
,如Locale
类所述。有关更多信息,请参见此相关问题。
例如,对于沙特阿拉伯文化规范的阿拉伯语言, 请使用:
Locale locale = new Locale( "ar" , "SA" ) ; // Arabic language. Saudi Arabia cultural norms.
我们可以使用该地区设置来本地化表示某一时刻的文本。
ZoneId z = ZoneId.of( "Pacific/Auckland" ); // By the way, time zone has *nothing* to do with locale, orthogonal issues.
ZonedDateTime zdt = ZonedDateTime.now( z );
Locale locale = new Locale( "ar" , "SA" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale );
String output = zdt.format( f );
当运行时。
Friday, January 18, 2019 12:14:00 PM New Zealand Daylight Time
要查看系统中可用的所有区域定义,请运行此代码。
for ( Locale locale : Locale.getAvailableLocales() ) {
System.out.println( locale.toString() + " Name: " + locale.getDisplayName( Locale.US ) );
}
今天的英文日期
LocalDate
类表示仅包含日期值而不包含时间和时区或与UTC偏移量的值。
时区对于确定日期至关重要。对于任何给定时刻,日期在全球各地的区域内变化。例如,在法国巴黎的午夜后几分钟是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。
如果没有指定时区,则JVM会隐式地应用其当前默认时区。该默认值可能在运行时任意更改,因此您的结果可能会有所不同。最好将所需/期望的时区明确指定为参数。
请以 大陆/地区
的格式指定一个适当的时区名称,例如 America/Montreal
、Africa/Casablanca
或 Pacific/Auckland
。永远不要使用2-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,没有标准化,甚至不唯一(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
如果您想使用JVM的当前默认时区,请请求并作为参数传递。如果省略,则代码变得模糊,我们无法确定您是否打算使用默认值,或者像许多程序员一样,不知道这个问题。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
或者指定一个日期。您可以通过数字设置月份,1-12代表一月到十二月。
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者更好的办法是使用预定义的
Month
枚举对象,每年一个。提示:在整个代码库中使用这些
Month
对象而不是仅仅使用整数来使您的代码更加自我记录,确保有效值并提供
类型安全性。对于
Year
和
YearMonth
也是如此。
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
要生成本地化为英语的文本,请使用
DateTimeFormatter.ofLocalizedDate
。
FormatStyle formatStyle = FormatStyle.FULL ;
Locale locale = new Locale( "en" , "US" ) ; // English language, United States cultural norms.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( formatStyle ).withLocale( locale );
String output = localDate.format( f ) ;
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了旧的传统日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
Joda-Time 项目现处于维护模式,建议迁移到java.time 类。
想要了解更多,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
您可以直接使用java.time 对象与数据库进行交换。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。无需使用字符串,也不需要使用java.sql.*
类。
如何获取 java.time 类?
ThreeTen-Extra 项目扩展了 java.time 的附加类。该项目是 java.time 可能的未来添加的试验场。您可能会在此处找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
和更多。
SimpleDateFormat displayFormat = new SimpleDateFormat("dd-MM-yyyy");
SimpleDateFormat parseFormat = new SimpleDateFormat("yyyy-MM-dd");
- Muhamet Aljobairi