SimpleDateFormat 日期为阿拉伯文

问题描述

我下载用户的日期数据并将这些数据写入 firebase。但是,从阿拉伯位置添加数据时,日期格式将无法正常工作。 我该如何解决这个问题?

输出

"٢٠٢١-٠٤-١٧"

我的代码

            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd",Locale.getDefault());
            String currentDateandTime = df.format(new Date());

我不想接收阿拉伯字母的数据。在任何情况下,我都应该将数据视为 17/04/2021。不像 /١٧/٢٠٢١。

解决方法

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 java.timemodern date-time API*

使用现代日期时间 API:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtfEnglish = DateTimeFormatter.ofPattern("dd/MM/uuuu",Locale.ENGLISH);

        DateTimeFormatter dtfArabic = DateTimeFormatter.ofPattern("dd/MM/uuuu",Locale.ENGLISH)
                .localizedBy(new Locale("ar"));

        // Change the ZoneId as per your requirement e.g. ZoneId.of("Asia/Dubai")
        LocalDate date = LocalDate.now(ZoneId.systemDefault());

        System.out.println(date.format(dtfEnglish));
        System.out.println(date.format(dtfArabic));
    }
}

输出:

18/04/2021
١٨/٠٤/٢٠٢١

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

,

我建议您使用 java.time(现代 Java 日期和时间 API)进行日期工作。如果我了解 Firebase 不提供 date 数据类型,那么我认为您需要:

    String currentDateandTime = LocalDate.now(ZoneId.systemDefault()).toString();
    System.out.println(currentDateandTime);

刚刚在我的时区运行时的输出:

2021-04-17

结果与语言环境无关。检索时,单参数 LocalDate.parse(CharSequence) 会将相同的字符串解析回 LocalDate

编辑:您想要的格式 2021-04-17 是一种称为 ISO 8601 的国际标准,我认为您在程序中也使用它是明智的。我正在利用 LocalDate 和 java.time 的其他类从它们的 toString 方法生成 ISO 8601 并在它们的单参数 parse 方法中解析相同的格式这一事实。因此,在处理 ISO 8601 时(作为一项规则),我们不需要为格式化或解析指定格式或格式化程序。如果您想要不同的格式,您可以使用 DateTimeFormatter 来指定它。

问题:java.time 不需要 Android API 级别 26 吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,内置了现代 API。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上,使用脱糖或 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间类。

链接