首页 > 解决方案 > 使用 SimpleDateFormat 和 UmmalquraCalendar 以阿拉伯语显示日期名称时获取空字符串

问题描述

SimpleDateFormat我想使用和 UmmalquraCalendar应用模式从日期中获取阿拉伯语中的日期名称。

Locale ar = new Locale("ar");
SimpleDateFormat dateFormat = new SimpleDateFormat("", ar );
Calendar hjCalender = new UmmalquraCalendar(ar);

dateFormat.setCalendar(hjCalender);
dateFormat.applyPattern("EEEE");
String day = dateFormat.format(hjCalender.getTime());
Log.v("MainActivity", "aa " + day);

它显示aa所以得到空字符串

[更新]

dateFormat = new SimpleDateFormat( "MMMM", new Locale("ar")) ; 
dateFormat.setCalendar(hjCalender);
Log.v("MainActivity" ," month ar " + 
dateFormat.format(hjCalender.getTime()));

我得到了 V/MainActivity: month ar ٠٠١ (不显示月份的名称)。

标签: androidcalendarlocalesimpledateformatarabic

解决方案


编辑:不建议对较旧的 Android(低于 API 级别 26)使用此答案。虽然我希望它始终为您提供正确的星期几,但它只会在 Java 8 及更高版本以及 Android API 级别 26 及更高版本上提供正确的 um Al-Qura 日历。

默认设置为您提供 umm Al-QuraHijrahDate日历:java.time

    Locale ar = new Locale("ar");
    DateTimeFormatter dayOfWeekFormatter = DateTimeFormatter.ofPattern("EEEE", ar);
    HijrahDate today = HijrahDate.now(ZoneId.of("Asia/Riyadh"));
    System.out.println("Chronology: " + today.getChronology());
    String day = today.format(dayOfWeekFormatter);
    System.out.println("aa " + day + " length " + day.length());

今天运行这个片段(Hijrah-umalqura AH 1439-10-26)给出:

Chronology: Hijrah-umalqura
aa الثلاثاء length 8

我不知道为什么你的代码不起作用。正如我在评论中所说,我无法重现您的错误。但是,SimpleDateFormat您使用的类已被证明很麻烦并且已经过时了。所以我们的想法是,如果您正在为 Android API 级别 26 或更高级别进行编程,您可以扔掉SimpleDateFormat并使用内置java.time的现代 Java 日期和时间 API 及其HijrahDate.

我首先建议,对于低于 26 的 API 级别,您可以使用 ThreeTenABP,这是 ThreeTen Backport 的 Android 改编版本,java.timeJava 6 和 7 的向后移植。但是,在评论中 Meno Hochschild 告诉我们这并不可靠:

即使您偶然发现了三个 backport 似乎返回预期结果的示例,它也不会是 umalqura 日历。许多日期相差一天。不幸的是,backport 没有复制 Hijri 日历的最新状态,java.time但仍然使用旧的三个开发状态,其中选择了 Hijri 日历的算法版本。如果您查看这两个库的 javadoc,您也会发现很大的不同。在这里,反向端口根本不是反向端口。

(由于 Stack Overflow 上的评论有时会被删除,我在此完整引用此评论。)

Android 上的另一个选择是研究同一个 Meno Hochschild 的库 Time4A 是否会给你想要的东西。它在下面的第三个链接中。不幸的是,我自己没有这方面的经验。

链接


推荐阅读