Joda可以使用阿拉伯数字格式化阿拉伯语区域设置的日期吗

时间:2014-08-04 07:17:03

标签: java internationalization jodatime icu

到目前为止的故事......

我们厌倦了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很难采用这种功能。

2 个答案:

答案 0 :(得分:2)

Joda只支持ASCII数字,它是硬编码的。

您始终可以使用String.replace和/或将DateTimeFormatter包装到代理中。

答案 1 :(得分:1)

java.time

仅供参考,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覆盖此行为,但我不知道。