Java 更改JodaTime中shortDate()格式的日期模式

Java 更改JodaTime中shortDate()格式的日期模式,java,date,datetime,locale,jodatime,Java,Date,Datetime,Locale,Jodatime,我有一个LocalDate,我想根据Locale格式模式打印日期,日期和月份为2位,年份为4位。 事实上,我可以使用DateTimeFormatter来设置短日期,但不幸的是“我不能”更改默认模式…有什么方法可以做到这一点吗 下面,我用一个例子来解释这一点: Locale l = Locale.ITALIAN; LocalDate localDate = new LocalDate( 2014, 8, 28); DateTimeFormatter formatterOutput1 = DateT

我有一个LocalDate,我想根据Locale格式模式打印日期,日期和月份为2位,年份为4位。 事实上,我可以使用DateTimeFormatter来设置短日期,但不幸的是“我不能”更改默认模式…有什么方法可以做到这一点吗

下面,我用一个例子来解释这一点:

Locale l = Locale.ITALIAN;
LocalDate localDate = new LocalDate( 2014, 8, 28);
DateTimeFormatter formatterOutput1 = DateTimeFormat.shortDate().withLocale(l);
System.out.println( "Output1: " + formatterOutput1.print(localDate));

l = Locale.ENGLISH;
DateTimeFormatter formatterOutput2 = DateTimeFormat.shortDate().withLocale(l);
System.out.println( "Output2: " + formatterOutput2.print(localDate));
结果是:

Output1: 28/08/14
Output2: 8/28/14
因此,输出是正确的,但我认为:

Output1: 28/08/2014
Output2: 08/28/2014
如何更改默认模式


谢谢

您应该编写自己的格式模式。在您的特殊情况下,它将是:

DateTimeFormatter formatterOutput1 = DateTimeFormat.forPattern("dd/MM/yyyy");
DateTimeFormatter formatterOutput2 = DateTimeFormat.forPattern("MM/dd/yyyy");

与其使用
shortDate()
不如使用
forStyle()
S
用于日期,将
-
用于时间

DateTimeFormat.patternForStyle("S-", Locale.ITALIAN);
然后在模式上执行字符串替换,将
yy
更改为
yyy

例如:

LocalDate localDate = new LocalDate(2014, 8, 28);
String pattern = DateTimeFormat.patternForStyle("S-", Locale.ITALIAN);
pattern = pattern.replace("yy", "yyyy");
DateTimeFormatter formatterOutput1 = DateTimeFormat.forPattern(pattern);
System.out.println("Output1: " + formatterOutput1.print(localDate));
将打印:

Output1: 28/08/2014
Output2: 8/28/2014
英语区域设置也是如此:

String patternEnglish = DateTimeFormat.patternForStyle("S-", Locale.ENGLISH);
patternEnglish = patternEnglish.replace("yy", "yyyy");
DateTimeFormatter formatterOutput2 = DateTimeFormat.forPattern(patternEnglish);
System.out.println("Output2: " + formatterOutput2.print(localDate));
将打印:

Output1: 28/08/2014
Output2: 8/28/2014

请注意,使用这种方法如果您只关心年份第4部分的数字,就不必担心了解所有区域设置格式。

是的,这可能是一个解决方案……但我需要将每个区域设置分开。我认为上面的解决方案是最正确的!无论如何,谢谢!:)虽然技术上是正确的,但我同意这个答案。要么让和完成本地化工作,要么定义自己的模式。混合两者(改变本地化输出)对我来说似乎是一种攻击,并且可能会导致问题。好的,主要问题是我的java项目(android应用程序)的国际化过程。在英国(例如),日期格式与德国/法国/意大利等不同。。。并且用户必须根据其区域设置查看正确的格式。我只能使用forPattern()方法,但不基于区域设置。使用前面的解决方案,我可以管理每个日期格式,并向用户发送正确的输出。。。我想……:)