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

时间:2018-07-15 19:00:27

标签: java android parsing simpledateformat

我正在制作一个使用API​​的应用程序,该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()时,都会出现此错误。我真的不知道该怎么办。

我还没有发布图像的权限,但是您可以在此处观看屏幕截图: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 "2017-04-26T20:55:00.000Z" string to a Date in java android studio

Android date format parse throwing an Unhandled Exception

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

3 个答案:

答案 0 :(得分:1)

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日期和时间API java.time,因为它可以更好地工作,尤其是旧的SimpleDateFormat类因麻烦而闻名。区别之一是:旧类在解析过程中引发了 checked 异常,这迫使我们在周围的方法上使用try-catchthrows声明。现代类抛出 unchecked 异常,这使我们无论是否要捕获和处理它们都留给我们。不过请不要上当:它们仍然是例外,可能会导致您的应用崩溃,因此,如果有可能出现格式不正确的字符串,请更好地处理它们。

作为旁注,请使用Java的内置日期格式,而不要指定自己的日期格式。它更简单,更不易出错,并且更容易适应其他语言和文化的受众。您的格式与美国语言环境的中等样式格式相符,因此我使用了此格式。

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

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

  • 在Java 8和更高版本以及较新的Android设备上(我被告知,从API级别26开始),内置了现代API。
  • 在Java 6和7中,获得ThreeTen Backport,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分:0)

该错误告诉您正在调用的函数会引发特定异常,而您没有捕获到该异常(如果无法解析字符串,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
}

答案 2 :(得分:0)

您可以使用Java 8的新API。

LocalDateTime日期= LocalDateTime.parse(字符序列文本)

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