我有这个密码
frame.sigdate.setText(new SimpleDateFormat("yyyy/M/d").format(new Date()));
它用英文号码从我的电脑上读取日期。我要做的是把日期转换成阿拉伯数字。有类似Local.ar
的东西吗?我很感谢你的帮助。
发布于 2018-04-15 07:20:06
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));
输出:
١٥/٤/٢٠١٨
关键是withDecimalStyle
。如果没有这个调用,格式化程序仍然会使用西方数字,就像在15/4/2018
中一样。您可能希望使用比ar
更具体的阿拉伯语标记,例如巴林的ar-BH
或也门的ar-YE
。有关可能性,请参见底部的链接。你也应该插入你想要的时区,我把亚洲/马斯喀特。
编辑:上面的内容已经在Java9中进行了测试。令人惊讶的是,在Java8中,它仍然使用西方(未本地化)数字。一个可能的解决方法(如果您愿意的话)是显式地指定零位数-它将从零位数中提取其他数字。
DecimalStyle arabicDecimalStyle
= DecimalStyle.of(arabicLocale).withZeroDigit('٠');
DateTimeFormatter arabicDateFormatter
= DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(arabicLocale)
.withDecimalStyle(arabicDecimalStyle);
它是withZeroDigit
参数中两个撇号之间的阿拉伯零。现在我在Java 8上得到了这个输出:
١٥/٠٤/١٨
使用内置的特定于地区的格式通常是个好主意,就像我在上面的两个片段中使用ofLocalizedDate
一样。如果您需要对格式进行更精细的控制,请使用ofPattern
。例如,要获得yyyy/mm/dd格式:
DateTimeFormatter arabicDateFormatter
= DateTimeFormatter.ofPattern("uuuu/MM/dd", arabicLocale)
.withDecimalStyle(arabicDecimalStyle);
输出:
٢٠١٨/٠٤/١٥
之所以将格式从Java 8更改为Java 9,是因为Java更改了地区数据来源的默认值,包括内置的本地化日期和时间格式。通过设置系统属性,您可以获得Java 8中已经存在的Java 9格式,例如:
System.setProperty("java.locale.providers", "CLDR,JRE,SPI");
通过这一更改,上面的第一个代码片段在Java 8上提供了与Java 9相同的输出:
١٥/٤/٢٠١٨
这里的重要细节是,CLDR
放在属性字符串的第一位。其优点是您不需要指定自己的格式模式字符串,对其他地区的本地化非常简单,一旦切换到Java 9或更高版本,用户不会对行为的改变感到惊讶。
我正在使用和推荐java.time
,这是一个现代的Java和time。您在这个问题中使用的SimpleDateFormat
类不仅很久以前就过时了,而且也是出了名的麻烦。你应该完全避免。使用现代API要好得多。
链接
java.time
。https://stackoverflow.com/questions/49839150
复制相似问题