到目前为止的故事......
我们厌倦了Java的Date API一般都很糟糕,最终最终采用了Joda Time,它更加健全(虽然它并不完美。)
最近,我们注意到Java的NumberFormat中有关阿拉伯语区域设置的问题。基本上,它使用“拉丁”数字而不是更自然的“阿拉伯”数字。所以我一直采用ICU的格式化程序作为Java的替代品。
现在我注意到Joda的日期格式化程序也用拉丁语打印数字。例如,如果您采用以下程序:
import java.util.Date;
import java.util.Locale;
import com.ibm.icu.text.DateFormat;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.junit.Test;
public class TestJoda {
@Test
public void test() {
Locale locale = new Locale("ar", "SA");
DateFormat icuDateFormat = DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.LONG, locale);
System.out.println("ICU: " + icuDateFormat.format(new Date()));
DateTimeFormatter jodaDateTimeFormatter =
DateTimeFormat.longDateTime().withLocale(locale);
System.out.println("Joda: " + jodaDateTimeFormatter.print(DateTime.now()));
}
}
输出如下:
ICU: ٤ أغسطس، ٢٠١٤ ٥:٠٧:١٤ م جرينتش+١٠
Joda: 04 أغسطس, 2014 EST 05:07:14 م
是否有某种方法可以强制Joda的格式化程序输出与ICU一致的样式?
我想在最坏的情况下会有一种实现某种适配器的方法,但Joda的类很好的一点是它们的不变性,不幸的是ICU很难采用这种功能。
答案 0 :(得分:2)
Joda只支持ASCII数字,它是硬编码的。
您始终可以使用String.replace
和/或将DateTimeFormatter
包装到代理中。
答案 1 :(得分:1)
仅供参考,Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。
我尝试使用java.time.format.DateTimeFormatter
类的内置自动本地化功能。看起来这与Joda-Time的行为相同,使用Westernized digits rather than Eastern Arabic numerals。
以UTC格式捕获当前时刻。调整为时区。
Instant instant = Instant.now ();
ZonedDateTime zdt = instant.atZone ( ZoneId.of ( "America/Montreal" ) );
生成一个String来表示日期时间值。
Locale l = new Locale ( "ar" , "MA" ); // Arabic language, cultural norms of Morocco.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( l );
转储到控制台。
String output = zdt.format ( f );
System.out.println ( "zdt.toString(): " + zdt );
System.out.println ( "output: " + output );
zdt.toString():2017-01-01T15:06:34.255-05:00 [美国/蒙特利尔]
输出:01يناير,2017 EST 03:06:34م
我不确定阿拉伯语是否会在此处正确复制粘贴。请参阅live code in IdeOne.com。
结论:默认情况下,java.time对阿拉伯语使用Westernized数字。
可能有办法用java.time.format.DateTimeFormatterBuilder覆盖此行为,但我不知道。