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

我已从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);

例外:


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)

尝试使用TimeZone在SimpleDateFormat中给出的内容 仍然获得相同的解析异常


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);


HUH函数
浏览 136回答 2
2回答

慕的地6264312

你不需要您所要求的转换很容易是多余的。您要输入类似的字符串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请注意,我们甚至不需要格式化程序来解析字符串。OffsetDateTime以及将java.timeISO 8601解析为默认值的许多其他类。由于我们对结果的要求更加精确,因此我们在这里使用格式化程序。xx例如,为我们提供了不带冒号的偏移量+0000。Date您使用的类已经过时了。也是SimpleDateFormat,而且也很麻烦。我建议您避免使用这些课程。问:我可以在Android上使用java.time吗?是的,java.time在较新和较旧的Android设备上均可正常运行。它至少需要Java 6。在Java 8和更高版本以及更新的Android设备中(有人告诉我,从API级别26开始),内置了现代API。在Java 6和7中,获取ThreeTen反向端口,即新类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。在较旧的Android上,请使用Android版本的ThreeTen Backport。它称为ThreeTenABP。并确保您导入org.threeten.bp带有子包的日期和时间类。骇客您所需的更改非常简单,只需要删除一个冒号即可。因此,另一个不需要ThreeTenABP的基本但简单的解决方案不是很好,而是一个正则表达式:    String inDesiredFormat = createdAtString.replaceFirst("([+-]\\d{2}):(\\d{2})$", "$1$2");这给出了与上述相同的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java