我有这段代码
frame.sigdate.setText(new SimpleDateFormat("yyyy/M/d").format(new Date()));
用英文编号从我的电脑上读取日期。我想要做的是将日期转换为阿拉伯数字。
有Local.ar
之类的东西吗?
我感谢任何帮助。
答案 0 :(得分:2)
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可以更好地使用。
java.time
。答案 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。