android - Android 弃用日期解析
问题描述
我使用此函数将字符串解析为日期格式
fun formatTimestampEDDMMMYYYY(date: String): String {
return E_DD_MMM_YYYY.format(Date.parse(date))
}
虽然它工作得很好,但 gradle 给出了一个错误说明
'parse(String!): Long' is deprecated. Deprecated in Java
我已经尝试在谷歌上搜索替代方案,但是从 2015 年前开始的许多结果都建议按照我的方式进行操作。如果有人有一些最新的方法来做这件事,我很想听听。
解决方案
- 你问得对。您不应使用已弃用的
parse(String!)
方法。它不仅因为某种原因而被弃用,而且还令人困惑,并且可能会让代码的读者对正在发生的事情感到困惑。 - 不应将一种格式的日期字符串转换为另一种格式的日期字符串。在您的程序中,您应该将日期保留为正确的日期对象,而不是字符串。
- 刚刚提到的正确日期对象应该取自现代 Java 日期和时间 API 的 java.time。该
Date
课程设计不佳且早已过时。看来您也在使用该SimpleDateFormat
课程。更糟糕的是,一个臭名昭著的班级麻烦制造者。把它们扔掉,改用 java.time。
java.time
我不知道你原来的字符串是什么样子的。我只是举一个示例字符串并向您展示如何解析。在 Java 中:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/u");
String originalDateString = "8/23/2020";
LocalDate yourDate = LocalDate.parse(originalDateString, dateFormatter);
System.out.println(yourDate);
输出:
2020-08-23
请从 java.time 中选择一个从字符串中获取尽可能多信息的类。如果您的字符串包含一天中的时间,请使用LocalDateTime
而不是LocalDate
. 如果它还包括时区或与 UTC 的偏移量,请使用ZonedDateTime
or OffsetDatetime
。
我认为与您的代码相比,该代码明确说明了字符串中预期的格式是一个相当大的优势。
当需要给出字符串输出时,格式如下:
DateTimeFormatter eDdMmmYyyy = DateTimeFormatter.ofPattern("E dd MMM yyyy", Locale.ENGLISH);
String formattedDate = yourDate.format(eDdMmmYyyy);
System.out.println(formattedDate);
2020 年 8 月 23 日星期日
Date.parse() 很神奇
我从来不知道会发生什么Date.parse()
。它试图变得友好并解析许多不同的格式,但是哪些格式没有得到很好的记录,并且该方法的行为非常难以预测。当我研究文档足够长的时间时,我能够弄清楚。但是没有人愿意长期研究文档来理解一个看似简单的代码行。
问题:java.time 不需要 Android API 级别 26 吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
- 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
- 在较旧的 Android 上,要么使用脱糖,要么使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保您从
org.threeten.bp
子包中导入日期和时间类。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- Java 规范请求 (JSR) 310,
java.time
第一次描述的地方。 - ThreeTen Backport 项目,
java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。 - 可通过脱糖获得 Java 8+ API
- ThreeTenABP , ThreeTen Backport 的安卓版
- 问题:如何在Android项目中使用ThreeTenABP,有非常详尽的解释。
推荐阅读
- java - 在 Wildfly 上使用 Spring Boot 战争应用程序查找远程 EJB 时出错
- python - Python 模拟依赖项
- c - 理解 C 中的 extern 关键字
- nuget - NuGet:两个带有目标文件的包导致错误复制的 DLL
- sql - 带有子查询的 INSERT INTO 是否作为单个事务运行(线程安全)?
- r - R中是否有一个函数可以按多列中的值过滤矩阵
- c# - Xamarin/ C# 选项卡式页面 Zxing 扫描仪问题
- facebook - 如何使用 api 检索 facebook 帖子背景?
- iis - 使用域名映射 IIS 应用程序。(完美适用于真实 IP)
- hadoop - Hadoop DFSClient getFileInfo():现有连接被远程主机强行关闭