SimpleDateFormat 打印“。” MMM 格式

SimpleDateFormat print "." for MMM format

我正在尝试使用 SimpleDateFormat 将日期字符串从一种格式转换为另一种格式。 转换有效,但有一个点“。”一个月后

    String dateStr = "04/02/1987";
    DateFormat df1 = new SimpleDateFormat("dd/MM/yyyy");
    Date d = df1.parse(dateStr);
    DateFormat df2 = new SimpleDateFormat("dd MMM yyyy");
    System.out.println(df2.format(d));

输出是 1987 年 2 月 4 日 而不是 1987 年 2 月 4 日.

创建对象时请在 SimpleDateFormat 构造函数中提供 Locale.ENGLISH,如下所示:

String dateStr = "04/02/1987";
DateFormat df1 = new SimpleDateFormat("dd/MM/yyyy");
Date d = df1.parse(dateStr);
DateFormat df2 = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH);
System.out.println(df2.format(d));

你的Locale.getDefault()是什么?

字母数字日期部分的不同输出可能是由格式化程序使用的 Locale 引起的。在大多数情况下,如果您没有自己指定,系统默认值 Locale 会被使用。我不确定 SimpleDateFormat 是否这样做,但似乎有可能。

我知道 java.time.format.DateTimeFormatter 是这样做的,请参阅以下使用 java.time 的示例,现代的和推荐使用 datetime API:

public static void main(String[] args) {
    String dateStr = "04/02/1987";
    LocalDate localDate = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
    System.out.println(localDate.format(DateTimeFormatter.ofPattern("dd MMM yyyy",
                                                                    Locale.ENGLISH)));
    System.out.println(localDate.format(DateTimeFormatter.ofPattern("dd MMM yyyy",
                                                                    Locale.FRENCH)));
}

输出:

04 Feb 1987
04 févr. 1987

关于月份的名称,输出(当然)是不同的,但是使用 Locale.FRENCH 会在缩写的月份名称后显示一个点。您的系统的默认 Locale 可能也是用点表示缩写的格式,但与数字部分 和 [= 的 Locale.ENGLISH 的输出格式相同33=]月份的缩写。