专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java修炼终极指南:15. 自定义本地化日期时间格式

temp10 2024-10-24 17:20:08 java教程 17 ℃ 0 评论


从JDK 8开始,我们拥有了一个全面的日期时间API,其中包含LocalDate、LocalTime、LocalDateTime、ZonedDateTime、OffsetDateTime和OffsetTime等类。我们可以通过DateTimeFormatter.ofPattern()轻松格式化这些类返回的日期时间输出。例如,这里我们使用y-MM-dd HH:mm:ss模式格式化一个LocalDateTime:

Java修炼终极指南:15. 自定义本地化日期时间格式

// 2023-01-07 15:31:22  
String ldt = LocalDateTime.now()  
  .format(DateTimeFormatter.ofPattern("y-MM-dd HH:mm:ss"));


捆绑的代码中提供了更多示例,但如果你需要深入覆盖这个主题,我建议你阅读《Java编码问题》(第一版)中的第58和59个问题。

那么,如何根据给定的Locale自定义我们的格式呢?例如,德国:

Locale.setDefault(Locale.GERMANY);


我们通过ofLocalizedDate()、ofLocalizedTime()和ofLocalizedDateTime()来实现这一点,如下所示:

// 7. Januar 2023  
String ld = LocalDate.now().format(  
  DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG));  
// 15:49  
String lt = LocalTime.now().format(  
  DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT));  
// 07.01.2023, 15:49:30  
String ldt = LocalDateTime.now().format(  
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM));


此外,我们可能还有:

// Samstag, 7. Januar 2023 um 15:49:30   
// Osteurop?ische Normalzeit  
String zdt = ZonedDateTime.now().format(  
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL));  
// 07.01.2023, 15:49:30  
String odt = OffsetDateTime.now().format(  
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM));  
// 15:49:30  
String ot = OffsetTime.now().format(  
  DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM));


本地化的日期、时间或日期时间格式化程序支持四种格式样式:

- FULL - 使用所有细节的格式。

- LONG - 使用很多细节但不使用所有细节的格式。

- MEDIUM - 使用一些细节的格式。

- SHORT - 尽可能短的格式(通常是数字的)。

根据本地化对象和格式样式的组合,代码可能会以DateTimeException异常结束,提示无法提取……。如果你看到这样的异常,那么是时候查阅下表了,该表提供了可接受的组合:


图1.17 - 本地化日期、时间和日期时间的格式样式

此外,从JDK 19开始,我们还可以使用ofLocalizedPattern(String pattern)。我们可以传递任何符合图1.18的模式:


图1.18 - 为ofLocalizedPattern(String pattern)构建模式

话虽如此,让我们将当前Locale更改为罗马尼亚:

Locale.setDefault(Locale.of("ro", "RO"));


然后,让我们看一些ofLocalizedPattern()的示例:

// 01.2023  
String ld = LocalDate.now().format(  
  DateTimeFormatter.ofLocalizedPattern("yMM"));  
// 15:49  
String lt = LocalTime.now().format(  
  DateTimeFormatter.ofLocalizedPattern("Hm"));  
// 01.2023, 15:49  
String ldt = LocalDateTime.now().format(  
  DateTimeFormatter.ofLocalizedPattern("yMMHm"));


甚至更多:

// 01.2023, 15:49:30 EET  
String zdt = ZonedDateTime.now().format(  
  DateTimeFormatter.ofLocalizedPattern("yMMHmsv"));  
// 01.2023, 15:49:30  
String odt = OffsetDateTime.now().format(  
  DateTimeFormatter.ofLocalizedPattern("yMMHms"));  
// 15:49:30  
String ot = OffsetTime.now().format(  
  DateTimeFormatter.ofLocalizedPattern("Hms"));

你可以在捆绑的代码中练习所有这些示例。此外,在捆绑的代码中,你可以找到一个应用程序,它使用Locale和NumberFormat为不同的Locale(货币)格式化版税金额。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表