Java Joda能用阿拉伯数字格式化阿拉伯语地区的日期吗?

Java Joda能用阿拉伯数字格式化阿拉伯语地区的日期吗?,java,internationalization,jodatime,icu,Java,Internationalization,Jodatime,Icu,到目前为止的故事 我们厌倦了Java的DateAPI通常是糟糕的,最终采用了Joda Time,它的工作原理更为合理(尽管它并不完美) 最近,我们注意到Java的NumberFormat中有关阿拉伯语语言环境的问题。本质上,它使用“拉丁”数字,而不是更自然的“阿拉伯”数字。所以我一直采用ICU的格式化程序作为Java的替代品 现在我注意到Joda的日期格式化程序也用拉丁语打印数字。例如,如果您采用以下程序: import java.util.Date; import java.util.Loca

到目前为止的故事

我们厌倦了Java的DateAPI通常是糟糕的,最终采用了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采用这一特性的速度很慢。

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

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

java.time 仅供参考,该项目目前正在进行中,团队建议迁移到类

我尝试使用该类内置的自动本地化功能。看起来这与Joda Time的行为相同,使用

捕获UTC中的当前时刻。调整到一个时区

Instant instant = Instant.now ();
ZonedDateTime zdt = instant.atZone ( ZoneId.of ( "America/Montreal" ) );
生成一个字符串以表示日期时间值

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[美国/蒙特利尔]

输出:2017年美国东部时间01:06:34

我不确定阿拉伯文是否能在这里正确复制粘贴。看

结论:默认情况下,java.time对阿拉伯语使用西化数字


也许有一种方法可以用,但我不知道。

令人失望,但知道总比不知道好。将它包装在一个能够修正数字的实现中似乎足够实用(但我必须注意人们可能编写的任何新代码,这些代码没有包装就获得了格式化程序。而且EST也会转化为某种东西…)实际上,这两种解决方案在整个上下文中看起来都不是真正实用的。String.replace会修复数字,但不会修复JRE格式本机无法格式化的其他内容,例如时区。和DateTimeFormatter。。。这在技术上应该是可行的,但它是一个看起来很难实现的格式化程序接口。