问题描述
我下载用户的日期数据并将这些数据写入 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.time
,modern 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 desugaring 和 How 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
导入日期和时间类。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time。
- 编辑:Wikipedia article: ISO 8601
-
Java Specification Request (JSR) 310,其中首次描述了
java.time
。 -
ThreeTen Backport project,将
java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 - Java 8+ APIs available through desugaring
- ThreeTenABP,ThreeTen Backport 的 Android 版
- Question: How to use ThreeTenABP in Android Project,非常详尽的解释。