我需要根据本地的顺序显示一个日期,日期为2位,月份为2位。所以对于April 10th 2020
,我想显示
- 对于区域设置US:
MM/DD/YYYY
->04/10/2020
- 对于区域设置英国:
DD/MM/YYYY
->10/04/2020
- 对于区域设置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。