java - 如何根据 Java 语言环境显示没有年份的日期?

标签 java date format locale

<分区>

我使用 DateFormat 和语言环境来显示日和月。 DateFormat 支持 MEDIUM, LONG, FULL 都有年份。我只想显示月份和日期。

我尝试使用 SimpleDateFormat,但 SimpleDateFormat 定义了月和日的顺序。在不同的国家,日期格式是不同的。我不想定义月和日的顺序。我希望日期格式由语言环境决定。

这是我的代码,如何从日期中删除年份?

Locale myLocale =Locale.FRANCE;

DateFormat localFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM, myLocale);

String   localDate     = localFormatter.format(date);

我尝试了以下语言环境并在右侧打印日期:

Locale myLocale =Locale.FRANCE; localDate=1 avr. 2018

Locale myLocale =Locale.CHINA; localDate=2018-4-1

Locale myLocale =Locale.JAPAN; localDate=2018/04/01

最佳答案

一个本地化的 DateFormat 可能是也可能不是一个 SimpleDateFormat,所以你不能确定它会有一个模式。但是,您可以获得本地化的 DateTimeFormatter模式,并从中去掉年份:

public static Format createMonthDayFormat(FormatStyle style,
                                          Locale locale) {
    String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        style, null, Chronology.ofLocale(locale), locale);
    pattern = pattern.replaceFirst("\\P{IsLetter}+[Yy]+", "");
    pattern = pattern.replaceFirst("^[Yy]+\\P{IsLetter}+", "");

    DateTimeFormatter formatter =
        DateTimeFormatter.ofPattern(pattern, locale);
    return formatter.toFormat();
}

但是有一个问题。返回的 Format 无法格式化 Date 或 Calendar 对象。它需要像 LocalDate 或 ZonedDateTime 这样的时间对象。您需要将 java.util.Date 转换为此类对象:

Format format = createMonthDayFormat(FormatStyle.SHORT, Locale.getDefault());

Date date = new Date();
String text = format.format(
    date.toInstant().atZone(ZoneId.systemDefault()));

关于java - 如何根据 Java 语言环境显示没有年份的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57502367/

相关文章:

java - 如何将两个字节的数字转换为两个单独的8位数字?

java - Gson Android 和异步任务

android - 适用于 iOS 和 Android 的音频格式

format - 如何将参数格式化为函数

java - IDEA 12.1.4 连接MySQL失败

java - 将字符串映射到整数数组 - Java

mysql - 日期之间的条件选择

arrays - Swift - 在一个大的时间范围内按一年中的一周对一系列项目进行分组

PHP - 设置/模拟假日期

java - 使用多行 "if"或 "ands"在 Java 中格式化 "ors"语句的正确方法是什么?