gpt4 book ai didi

java - 无法在 Android 上将字符串转换为日期

转载 作者:行者123 更新时间:2023-12-02 02:04:44 25 4
gpt4 key购买 nike

我从 API 中获取了一个字符串,格式为 2017-04-23T19:47:39+00:00如何将其转换为格式“2017-04-23T19:47:39-0000”的日期?

我尝试了以下方法,但它给出了 ParseException

String created_at_string = "2017-04-23T19:47:39+00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date created_at = sdf.parse(created_at_string);

异常(exception):

06-22 18:18:32.517 10396-10396/com.harit.abs W/System.err: java.text.ParseException: Unparseable date: ""2018-04-29T10:55:37+00:00""
at java.text.DateFormat.parse(DateFormat.java:358)
at com.harit.abs.Sync_Activity.bu(Sync_Activity.java:169)
at com.harit.abs.Sync_Activity$2.onCompleted(Sync_Activity.java:118)
at com.harit.abs.Sync_Activity$2.onCompleted(Sync_Activity.java:87)
at com.koushikdutta.async.future.SimpleFuture.handleCallbackUnlocked(SimpleFuture.java:107)
at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:141)
at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:128)
at com.koushikdutta.ion.IonRequestBuilder$1.run(IonRequestBuilder.java:246)
at com.koushikdutta.async.AsyncServer$RunnableWrapper.run(AsyncServer.java:60)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)

尝试了 SimpleDateFormat with TimeZone 中给出的内容仍然得到相同的解析异常

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
String created_at_string = "2017-04-23T19:47:39+00:00";
Date created_at = sdf.parse(created_at_string);

最佳答案

你不需要

您所询问的转换很容易是多余的。您要求输入类似 2017-04-23T19:47:39-0000 的字符串。该字符串采用 ISO 8601 格式,即国际标准格式。因此,根据您的具体情况,我希望 ISO 8601 中的字符串适合您。您已经获得的字符串 2017-04-23T19:47:39+00:00 也在 ISO 8601 中!该标准允许一些变化,其中之一是偏移量中的冒号是可选的。所以我认为你应该做的第一件事就是传递你得到的字符串,看看它是否有效。如果没有,请继续阅读。

java.time

使用现代 Java 日期和时间 API java.time,您想要的转换如此顺利进行:

    DateTimeFormatter formatterWithoutColon 
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssxx");
String createdAtString = "2017-04-23T19:47:39+00:00";
OffsetDateTime dateTime = OffsetDateTime.parse(createdAtString);
String inDesiredFormat = dateTime.format(formatterWithoutColon);
System.out.println(inDesiredFormat);

这将打印所需的内容:

2017-04-23T19:47:39+0000

请注意,我们甚至不需要格式化程序来解析字符串。 OffsetDateTimejava.time 的许多其他类将 ISO 8601 解析为默认值。由于我们对结果的要求更加精确,因此我们在这里使用格式化程序。 xx 为我们提供不带冒号的偏移量,例如 +0000

您使用的Date 类早已过时。 SimpleDateFormat 也是如此,而且它也非常麻烦。我建议你避免这些类(class)。

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

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

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

黑客攻击

您需要的更改非常简单,您只需删除一个冒号即可。因此,另一个不需要 ThreeTenABP 的、不太好但基本且简单的解决方案是正则表达式:

    String inDesiredFormat = createdAtString.replaceFirst("([+-]\\d{2}):(\\d{2})$", "$1$2");

这给出了与上面相同的结果。

链接

关于java - 无法在 Android 上将字符串转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50988150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com