我在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 。
有没有解决方法来解决这个问题?
答案 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
这不是你要求的。您可能会遇到异议,但无论您选择哪种格式,都会发生这种情况,因为许多人对其语言环境的正确格式有自己的想法。不过,这是非常标准化的,所以请考虑它。
我知道您是从"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个月以相同的三个字母开头。这些地区包括西藏,斯瓦希里语,索马里语,康沃尔语,苏格兰盖尔语和越南语。在这些语言中,没有人能够分辨出任何月份。请三思。
java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。答案 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