java.time 格式日期取决于语言环境,包括 2 位数字的日/月和 4 位数字的年份

java.time format date depending on locale with 2 digits day/month and 4 digits year

提问人:stefan.at.kotlin 提问时间:4/10/2020 更新时间:11/28/2020 访问量:1024

问:

我需要根据本地的顺序显示一个日期,包括 2 位数字的日期、2 位数字的月份、4 位数字的年份。所以我想展示April 10th 2020

  1. 对于美国区域设置: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.timeThreeTenABP

Kotlin 日期格式化 java-time threetenabp

评论


答:

3赞 Anonymous 4/11/2020 #1

恐怕需要一些手工工作。例如,在 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));

不同语言环境中的示例输出:

  • 美国: 04/10/2020
  • 英国:10/04/2020
  • 德国: 10.04.2020
  • 瑞典语/: 2020-04-10sv
  • 香港/: 2020年04月10日 (我不知道这是否正确)zh-HK
0赞 Marko T 11/28/2020 #2

Ole V.V.的答案从奥利奥开始起作用,但许多设备都在使用旧版本的Android。以下内容适用于大多数国家/地区的所有 Android 版本。

这看起来很骇人听闻,但 DateFormat 的官方 JavaDoc 表示,将格式从工厂方法转换为 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)
}

你可以把它包装在一个try-catch-block中,并为少数几个不起作用的特殊国家做一些聪明的事情。或者对于他们来说,你可以放弃并使用他们默认的短格式。我很确定人类可以理解这种格式:-D。

评论

1赞 Anonymous 6/28/2022
供您参考,当 OP 说我实际上正在使用 Android 的 java.time 端口 (ThreeTenABP) 时,那么 ThreeTenABP 库完全是为 Oreo 之前的 Android 版本(API 级别 26)而开发的(尽管它也适用于更高版本)。