0

我需要根据当地的顺序显示一个日期为 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 个语言环境只是示例。

我实际上正在使用java.timeAndroid ( ThreeTenABP) 的端口,尽管这不相关。

4

2 回答 2

1

I am afraid that it will take some hand work. For example, in Java because this is what I can write:

    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));

Example outputs in different locales:

  • US: 04/10/2020
  • UK: 10/04/2020
  • Germany: 10.04.2020
  • Swedish/sv: 2020-04-10
  • Hong Kong/zh-HK: 2020年04月10日 (I got no idea whether this is correct)
于 2020-04-11T15:38:10.523 回答
0

Ole VV 的答案适用于 Oreo 前锋,但许多设备使用的是旧版本的 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。

于 2020-11-27T23:33:35.137 回答