不同的日期格式

时间:2018-01-19 16:13:26

标签: android date simpledateformat date-format

我在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等等。因此,在月份缩写之前和之后总是有一个点。当语言设置为英语时,它会返回28.Oct.2015,但是,当语言设置为德语时,它返回28.Okt..2015,其中两个 Okt 2015

有没有解决方法来解决这个问题?

3 个答案:

答案 0 :(得分:2)

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

使用内置的本地化格式

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

我在评论中建议您将ThreeTenABP添加到Android项目中,以便使用现代Java日期和时间API java.time。与它合作真是太好了。现在我正在服用自己的药:

    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

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

链接

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

 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