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

Posted

技术标签:

【中文标题】android:如何将字符串转换为日期【英文标题】:android: how to convert a string to Date 【发布时间】:2018-12-23 09:07:18 【问题描述】:

我正在制作一个应用程序,该应用程序使用提供带有时间戳的数据的 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

【问题讨论】:

答案在您提供的第四个链接中 您的代码编译正确并给出正确答案。 欢迎来到 Stack Overflow。你的问题有矛盾。你说你不能编译。你说你得到一个异常,它只能在运行时发生,也就是在你编译成功之后。您可能对编译时错误和运行时错误之间的区别感到困惑?我投票结束,因为不清楚你在问什么。请在问题中澄清,我很乐意撤回我的近距离投票。 如果您在运行程序时确实遇到了异常,那么这可能是重复的Java - Unparseable date。 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。 【参考方案1】:

该错误告诉您,您正在调用的函数可以抛出一个特定的异常并且您没有捕获它(如果无法解析字符串,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

【讨论】:

感谢您,我设法解决了这个问题。只有日期日期,需要在尝试中。不是整个 dateFormat: DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.US);尝试 Date date = dateFormat.parse("2018 年 7 月 20 日"); catch (java.text.ParseException e) e.printStackTrace(); if (game.getBuyonline().equals("true")) onlineGames.add(game); 【参考方案2】:

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 类以麻烦而闻名。一个区别是:旧类从解析中抛出了一个 checked 异常,这迫使我们在周围的方法上使用 try-catchthrows 声明。现代类抛出 unchecked 异常,这让我们决定是否要捕获和处理它们。不过不要上当:它们仍然是异常,可能会导致您的应用崩溃,因此如果有可能出现格式不正确的字符串,请更好地处理它们。

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

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

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

在 Java 8 及更高版本以及更新的 Android 设备上(据我所知,从 API 级别 26 开始)现代 API 是内置的。 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

Oracle tutorial: Date Time 解释如何使用java.time。 Java Specification Request (JSR) 310,其中首次描述了 java.time。 ThreeTen Backport project,java.time 到 Java 6 和 7(JSR-310 的 ThreeTen)的反向移植。 ThreeTenABP,Android 版 ThreeTen Backport Question: How to use ThreeTenABP in Android Project,解释得很透彻。

【讨论】:

【参考方案3】:

您可以使用 Java 8 的新 API。

LocalDateTime 日期 = LocalDateTime.parse(CharSequence 文本)

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

【讨论】:

这个问题是关于日期的,而不是日期时间的。所以LocalDate类。 使用现代 API java.time 是个好主意。如果提问者的意思是“时间戳”,那么你的答案很接近。另一方面,如果我们相信字符串是Jul 20, 2018,@BasilBourque 是正确的,LocalDate 是正确的类。

以上是关于android:如何将字符串转换为日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android中将时间戳字符串转换为日期[重复]

在android中将字符串转换为日期格式

java中如何将字符串转换成日期型

将 UTC 日期时间字符串转换为本地日期时间

如何将日期字符串转换为没有时区的日期对象

sql如何将字符串转为日期