如何将日期从英语转换为阿拉伯语

时间:2018-04-15 06:36:17

标签: java date arabic

我有这段代码

frame.sigdate.setText(new SimpleDateFormat("yyyy/M/d").format(new Date()));

用英文编号从我的电脑上读取日期。我想要做的是将日期转换为阿拉伯数字。 有Local.ar之类的东西吗? 我感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

java.time

    Locale arabicLocale = Locale.forLanguageTag("ar");
    DateTimeFormatter arabicDateFormatter
            = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
                    .withLocale(arabicLocale)
                    .withDecimalStyle(DecimalStyle.of(arabicLocale));
    LocalDate today = LocalDate.now(ZoneId.of("Asia/Muscat"));
    System.out.println(today.format(arabicDateFormatter));

输出:

  

15 /二千〇一十八分之四

关键是withDecimalStyle。如果没有此调用,格式化程序仍将使用西方数字,如15‏/4‏/2018中所示。对于阿拉伯语,您可能需要使用比ar更具体的语言标记,例如巴林为ar-BH或也门为ar-YE。请参阅底部的链接了解可能性。您还应该在我放置亚洲/马斯喀特的地方插入您想要的时区。

编辑:以上内容已在Java 9中测试过。令人惊讶的是,在Java 8中,它仍使用西方(非本地化)数字。可能的修复(或者如果你喜欢的解决方法)是明确指定零数字 - 它将从中获取其他数字。

    DecimalStyle arabicDecimalStyle
            = DecimalStyle.of(arabicLocale).withZeroDigit('٠');
    DateTimeFormatter arabicDateFormatter
            = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
                    .withLocale(arabicLocale)
                    .withDecimalStyle(arabicDecimalStyle);

withZeroDigit的论证中,两个撇号之间是阿拉伯语零。现在我在Java 8上得到了这个输出:

  

15/04/18

在上面的两个片段中,使用内置的语言环境特定格式通常是一个好主意,就像我使用ofLocalizedDate一样。如果您需要更好地控制格式,请改用ofPattern。例如,要获得yyyy / mm / dd格式:

    DateTimeFormatter arabicDateFormatter
            = DateTimeFormatter.ofPattern("uuuu/MM/dd", arabicLocale)
                    .withDecimalStyle(arabicDecimalStyle);

输出:

  

2018年4月15日

格式从Java 8更改为Java 9的原因是Java已更改区域设置数据的默认值,包括内置的本地化日期和时间格式。您可以通过设置系统属性来获取Java 8中已有的Java 9格式,例如:

    System.setProperty("java.locale.providers", "CLDR,JRE,SPI");

通过此更改,上面的第一个代码片段在Java 8上提供与在Java 9上相同的输出:

  

15 /二千〇一十八分之四

这里重要的细节是CLDR在属性字符串中排在第一位。优点是您不需要指定自己的格式模式字符串,本地化到其他语言环境很简单,一旦切换到Java 9或更高版本,用户就不会对行为的改变感到惊讶。

我正在使用并推荐现代Java日期和时间API java.time。你在问题中使用的SimpleDateFormat类不仅已经过时了,而且也是出了名的麻烦。恕我直言,你应该完全避免它。现代API可以更好地使用。

链接

答案 1 :(得分:1)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");

String date = "16/08/2011";
Locale arabicLocale = Locale.forLanguageTag("ar-SA");
DateTimeFormatter arabicDateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(arabicLocale).withDecimalStyle(DecimalStyle.of(arabicLocale));

LocalDate today = LocalDate.now(ZoneId.of("Asia/Muscat"));
today = LocalDate.parse(date, formatter);

String dat = today.format(arabicDateFormatter);
System.out.println(dat);

放出١٦/٨/٢٠١١

答案 2 :(得分:0)

尝试下面的approch

java.util.Locale locale = new java.util.Locale("ar");
java.text.DecimalFormat df = (java.text.DecimalFormat)
java.text.DecimalFormat.getNumberInstance(locale);

答案 3 :(得分:0)

DateTime dateTimeObjectInUTC = new DateTime(DateTimeZone.UTC);
DateTimeZone dateTimeZoneObject = DateTimeZone.forID("Asia/Riyadh");

java.util.Locale locale = new Locale("ar","SA");
DateTimeFormatter formatter = DateTimeFormat.forStyle("FF").withLocale(locale).withZone(dateTimeZoneObject);
String output = formatter.print(dateTimeObjectInUTC);

这应该有帮助!

我正在使用Joda-Time。请参阅Jodatime文档。例如DateTimeZone documentation