android: 如何将字符串转换为日期

android: how to convert a string to Date

我正在制作一个应用程序,该应用程序使用 API 来提供带有时间戳的数据。 时间戳看起来像:

Jul 20, 2018

我想将字符串转换为日期。 我尝试使用此代码将字符串解析为日期。

DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.US);
            Date date = dateFormat.parse("Jul 20, 2018");

但我什至不能编译我的代码。每次我尝试使用 dateformat.parse() 解析字符串时,都会出现以下编译错误:

java.text.ParseException

这甚至会在悬停在代码中的 .parse() 上方时出现 我浏览了一整天并尝试了一些不同的东西,但每次我使用 .parse() 时都会收到此错误。我真的不知道该怎么办了。

我还没有 post 图片的权限,但是你可以在这里看截图:https://imgur.com/ux5l9hY

我正在使用 Java 8(支持 lambda 表示法)。我正在使用 androidx.legacy:legacy-support 库,最小 API 19,目标 API 28。 (所以这个问题的解决方案应该也支持旧设备)

我尝试但失败的其他事情:

Android, How can I Convert String to Date?

Cant convert String to date in android

How to convert a date in this format (Tue Jul 13 00:00:00 CEST 2010) to a Java Date (The string comes from an alfresco property)

Convert string to Date in java

该错误告诉您您正在调用的函数可能会抛出一个特定的异常,而您没有捕获它(如果无法解析字符串,dateFormat.parse(...) 可能会抛出 ParseException 错误)。

尝试这样的事情

try {
    DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.US);
    Date date = dateFormat.parse("Jul 20, 2018");
}
catch(ParseException pe ) {
    // handle the failure
}

您可以使用新的 API of Java 8 .

LocalDate date = LocalDate.parse(CharSequence text);

text - 要解析的文本,例如“2007-12-03T10:15:30”,不为空。

java.time

    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.MEDIUM)
            .withLocale(Locale.US);
    LocalDate date = LocalDate.parse("Jul 20, 2018", dateFormatter); 

如果您知道您的日期字符串是正确的,只需使用上面的代码而不使用任何 try-catch。如果您需要验证字符串(通常如果它是从用户或不同系统输入的),请直接在解析周围或代码中它所在的位置使用 try-catch最方便处理任何不正确的字符串。示例:

    try {
        LocalDate date = LocalDate.parse("Jul 20, 2018", dateFormatter);
    } catch (DateTimeParseException dtpe) {
        dtpe.printStackTrace();
    } 

我正在使用 java.time,现代的 Java 日期和时间 API,因为它更好用,而旧的 SimpleDateFormat [=88= 】 尤其是出了名的麻烦。一个区别是:旧的 class 从解析中抛出 checked 异常,这迫使我们使用 try-catchthrows 周围方法的声明。现代 classes 会抛出 unchecked 异常,这让我们决定是否要捕获和处理它们。但不要被愚弄:它们仍然是异常,可能会导致您的应用程序崩溃,因此如果有任何可能出现格式不正确的字符串,请更好地处理它们。

作为旁注,最好使用 Java 的内置日期格式,而不是指定您自己的日期格式。它更简单,更不容易出错,更容易适应其他语言和文化的受众。您的格式符合美国语言环境的中型格式,所以我使用了这个。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接