不同的日期格式

Different Date Formats

我在 Android 应用程序中转换日期时遇到问题。 我的问题是我有两种不同的日期格式。

SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
DateFormat formatter_date = new SimpleDateFormat("dd.MMM.yyyy");
Date myDate = null;
try {
    myDate = dateFormat.parse("28.10.2015");
} catch (ParseException e) {
    e.printStackTrace();
}
formatter_date.format(myDate,"dd.MM.yyyy"))
txtDate.setText(formatter_date.format(myDate,"dd.MM.yyyy")));

我想在设置为英语的设备上将日期格式设置为 28.Oct.2015,在德语中设置为 28.Okt.2015,等等。所以在月份前后总是一个点缩写。当语言设置为英语时,它应该 returns 28.Oct.2015,但是,当语言设置为德语时,它 returns 28.Okt..2015 和 [=17= Okt2015.

之间有两个 点

有什么解决办法吗?

SimpleDateFormat dateFormat = new SimpleDateFormat(String pattern, Locale locale);

有另一个构造函数 Locale 更改 Locale.ENGLISH 以英语设置日期。您可以检查其他区域设置选项。我通常使用 Locale.getDefault() 以用户首选语言显示日期。

感谢您的帮助,但此解决方案最适合我

 DateFormat formatter_month = new SimpleDateFormat("MMMM"); //Get Whole Name of Month
 DateFormat formatter_day = new SimpleDateFormat("dd."); //Get Day + Dot(2 digits)
 DateFormat formatter_year = new SimpleDateFormat(".yyyy"); //Get Dot + Year(4 digits)
 String str_date = formatter_day.format(date)+  //Day
 formatter_month.format(date).substring(0,3)+   //Month
 formatter_year.format(date);   //Year

我想挑战一下你的要求。正如您自己的答案已经显示的那样,您当然可以拥有它。但是你想要吗?

使用内置的本地化格式

Java 具有适用于所有可用语言环境的本地化格式(我认为是全部,无论如何都是很多)。我建议您使用这些而不是您自己对本地化日期应该是什么样子的想法。虽然 28.Okt.2015 在奥地利和其他讲德语的地方可能很常见,但说英语的人不习惯你格式中的点,我怀疑世界上有些人或多或少会发现它奇怪。

我在评论中建议您将 ThreeTenABP 添加到您的 Android 项目中,以便使用 java.time、现代 Java 日期和时间 API。与它一起工作要好得多。现在我自己吃药了:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
    LocalDate myDate = LocalDate.of(2015, Month.OCTOBER, 28);
    System.out.println(myDate.format(dateFormatter));

不同语言环境的输出包括:

German:     28.10.2015
UK English: 28 Oct 2015
French:     28 oct. 2015

这不是你要的。您可能会遇到反对意见,但无论您选择哪种格式,这种情况都会发生,因为许多人对适合其语言环境的正确格式有自己的想法。不过,它非常标准化,所以请考虑一下。

编辑:LocalDate 从何而来?

我了解到您是从 "28.10.2015" 这样的字符串转换过来的。当您知道如何将其转换为 LocalDate 时很简单:

    DateTimeFormatter numericDateFormatter = DateTimeFormatter.ofPattern("dd.MM.uuuu");
    LocalDate myDate = LocalDate.parse("28.10.2015", numericDateFormatter);

仅当您从遗留 API 中获得了一个您现在无法更改或不想更改的 java.util.Date 时,首先将其转换为现代 Instant 类型,然后从那里做进一步的转换:

    LocalDate myDate = oldfashionedJavaUtilDate.toInstant()
            .atZone(ZoneId.of("Europe/Vienna"))
            .toLocalDate();

由于这是对时区敏感的操作,我建议您指定一个明确的时区。您可以通过指定 ZoneId.systemDefault() 来使用 JVM 的时区设置,但请注意这是脆弱的:JVM 设置可能会被您程序的其他部分或同一程序中的其他程序 运行 在您脚下更改JVM.

你问的是什么

您要求的 java.time 版本与您自己的答案中的代码非常相似:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd");
    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM");
    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("uuuu");
    LocalDate myDate = LocalDate.of(2015, Month.OCTOBER, 28);
    String dayOfMonth = myDate.format(dateFormatter);
    String monthName = myDate.format(monthFormatter);
    if (monthName.length() > 3) {
        monthName = monthName.substring(0, 3);
    }
    String year = myDate.format(yearFormatter);
    String formattedDate = dayOfMonth + '.' + monthName + '.' + year;
    System.out.println(formattedDate);

在与上述相同的语言环境中输出:

German:     28.Okt.2015
UK English: 28.Oct.2015
French:     28.oct.2015

虽然有一个更短的方法来获得同样的东西:

    String formattedDate = String.format("%1$td.%2$.3s.%1$tY", 
            myDate,
            myDate.getMonth().getDisplayName(TextStyle.FULL, Locale.getDefault()));

读起来更难。我尝试了很多次才使格式字符串 %1$td.%2$.3s.%1$tY 完全正确。如果那些维护您的代码的人习惯于 DateTimeFormatter 格式化日期(和时间),这会让他们感到惊讶。所以我真的不推荐它,但选择是你的。

在另一个日期,我在法语语言环境中得到以下输出:

08.jui.2018

不会说法语的人,也不会知道这个日期是在六月 (juin) 还是七月 (juillet)。在我的 JVM 中的 57 个可用语言环境中,一年中的所有 12 个月 都以相同的三个字母开头。这些语言环境包括藏语、斯瓦希里语、索马里语、康沃尔语、苏格兰盖尔语和越南语。在这些语言中,没有人能够区分任何月份。请三思。

链接