Android 弃用日期解析

Android deprecated date parsing

我用这个函数把字符串解析成日期格式

 fun formatTimestampEDDMMMYYYY(date: String): String {
    return E_DD_MMM_YYYY.format(Date.parse(date))
}

虽然它工作得很好,但 gradle 给出了一个错误说明

'parse(String!): Long' is deprecated. Deprecated in Java

我尝试在 google 上搜索替代方案,但是 2015 年之前的许多结果都建议按照我的方式进行。如果有人有一些最新的方法来做这件事,我很想听听。

fun myFunction(formattedStr: String?): String {
        formattedStr?.let {
            val inputFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
            val outputFormat = SimpleDateFormat("EE, MMMM dd, yyyy h:mm a")
            return outputFormat.format(inputFormat.parse(it))
        }
        return ""
    }

你可以试试上面的功能。并根据您的要求更改日期格式。

  1. 你问的对。您不应使用已弃用的 parse(String!) 方法。它不仅因为某种原因被弃用,而且还令人困惑,并且可能会让您的代码 reader 对正在发生的事情感到困惑。
  2. 您不应将一种格式的日期字符串转换为另一种格式的日期字符串。在您的程序中,您应该将日期保留为正确的日期对象,而不是字符串。
  3. 刚才提到的正确日期对象应该取自java.time,现代Java日期和时间API。 Date class 设计不佳且早已过时。您似乎也在使用 SimpleDateFormat class。更糟的是,臭名昭著的class麻烦制造者。扔掉它们,改用 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 中选择一个 class,它会从字符串中获取尽可能多的信息。如果您的字符串包含一天中的时间,请使用 LocalDateTime 而不是 LocalDate。如果它还包括时区或与 UTC 的偏移量,请使用 ZonedDateTimeOffsetDatetime.

我认为与您的代码相比,此代码明确说明字符串中应采用哪种格式是一个很大的优势。

当需要给字符串输出时,格式如下:

    DateTimeFormatter eDdMmmYyyy = DateTimeFormatter.ofPattern("E dd MMM yyyy", Locale.ENGLISH);
    String formattedDate = yourDate.format(eDdMmmYyyy);
    System.out.println(formattedDate);

Sun 23 Aug 2020

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,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接) .
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接