Android不建议使用的日期解析

问题描述

我使用此功能将字符串解析为日期格式

 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年之前的许多结果都建议按照我的方式进行。如果有人有一些最新的方法,我很想听听。

解决方法

  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的时差,请使用ZonedDateTimeOffsetDatetime

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

当您需要输出字符串时,请按照以下方式进行格式化:

    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,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在较旧的Android上,请使用废除旧书或Android版本的ThreeTen Backport。称为ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类。

链接

,
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 ""
    }

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