首页 > 解决方案 > 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 年前开始的许多结果都建议按照我的方式进行操作。如果有人有一些最新的方法来做这件事,我很想听听。

标签: androiddatedate-parsingjava.util.date

解决方案


  1. 你问得对。您不应使用已弃用的parse(String!)方法。它不仅因为某种原因而被弃用,而且还令人困惑,并且可能会让代码的读者对正在发生的事情感到困惑。
  2. 不应将一种格式的日期字符串转换为另一种格式的日期字符串。在您的程序中,您应该将日期保留为正确的日期对象,而不是字符串。
  3. 刚刚提到的正确日期对象应该取自现代 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 的偏移量,请使用ZonedDateTimeor 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子包中导入日期和时间类。

链接


推荐阅读