java.time格式日期取决于区域设置,日期/月为2位,年为4位



我需要根据本地的顺序显示一个日期,日期为2位,月份为2位。所以对于April 10th 2020,我想显示

  1. 对于区域设置US:MM/DD/YYYY->04/10/2020
  2. 对于区域设置英国:DD/MM/YYYY->10/04/2020
  3. 对于区域设置DE(德国(:DD.MM.YYYY->10.04.2020

我尝试了以下操作,但没有成功:

// this one already fails for DE, because it gives 10.04.20 (only 2 digit years)
myDate?.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT))
// works for DE (gives 10.04.2020), fails for UK as is gives 10 Apr 2020 instead of 10/04/2020
myDate?.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM))

那么,我如何获得一个只有2位数的日/月和4位数的年的本地日期格式?请注意,我正在寻找一个通用的解决方案,这里明确说明的3个区域设置只是示例。

实际上,我使用的是Android的java.time端口(ThreeTenABP(,尽管这不应该相关。

恐怕这需要一些手工工作。例如,在Java中,因为这是我可以写的:

Locale formattingLocale = Locale.getDefault(Locale.Category.FORMAT);
String builtInPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT, null, IsoChronology.INSTANCE,
formattingLocale);
String modifiedPattern = builtInPattern.replaceFirst("y+", "yyyy")
.replaceFirst("M+", "MM")
.replaceFirst("d+", "dd");
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(modifiedPattern, formattingLocale);
LocalDate myDate = LocalDate.of(2020, Month.APRIL, 10);
System.out.println(myDate.format(dateFormatter));

不同地区的输出示例:

  • 美国:2020年10月4日
  • 英国:2020年4月10日
  • 德国:2020年4月10日
  • 瑞典语/sv:2020-04-10
  • 香港/zh-HK:2020年04月10日(我不知道这是否正确(

Ole V.V.的答案在奥利奥的转发中有效,但许多设备都在使用旧版本的Android。以下适用于大多数国家/地区的所有Android版本。

这看起来很粗糙,但官方的JavaDoc for DateFormat表示,将格式从工厂方法转换为SimpleDateFormat在大多数国家都有效。

val dateFormat = DateFormat.getDateInstance(DateFormat.SHORT)
if (dateFormat is SimpleDateFormat) {
val adjustedPattern = dateFormat.toPattern()
.replace("y+".toRegex(), "yyyy")
.replace("M+".toRegex(), "MM")
.replace("d+".toRegex(), "dd")
dateFormat.applyPattern(adjustedPattern)
}

你可以把它放在一个尝试-捕捉块中,为少数几个不起作用的特殊国家做一些聪明的事情。或者,对于它们,你可以放弃,使用它们默认的短格式。我确信人类能够理解这种格式:-D。

相关内容

  • 没有找到相关文章

最新更新