我已从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)
尝试了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);
答案 0 :(得分:2)
您要询问的转换很容易是多余的。您要输入2017-04-23T19:47:39-0000
之类的字符串。此字符串为ISO 8601格式(国际标准格式)。因此,根据您的实际情况,我希望ISO 8601中的字符串适合您。您已经获得的字符串2017-04-23T19:47:39+00:00
也在ISO 8601中!该标准允许一些变化,其中之一是偏移量中的冒号是可选的。因此,我认为您应该做的第一件事是传递所获得的字符串,看看是否可行。如果没有,请继续阅读。
借助java.time
现代的Java日期和时间API,您想要的转换很顺利 >>
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.time
的许多其他类将ISO 8601解析为其默认值。由于我们对结果的要求更加精确,因此我们在这里使用格式化程序。 xx
给出了不带冒号的偏移量,例如+0000
。
您使用的Date
类早已过时。 SimpleDateFormat
也是如此,这也非常麻烦。我建议您避免使用这些课程。
是的,java.time
在较新的Android设备上都能很好地工作。它只需要至少Java 6 。
org.threeten.bp
导入日期和时间类。您所需的更改非常简单,您只需要删除一个冒号即可。因此,另一个不需要ThreeTenABP的但不是很好但是简单的基本解决方案是一个正则表达式:
String inDesiredFormat = createdAtString.replaceFirst("([+-]\\d{2}):(\\d{2})$", "$1$2");
与上面的结果相同。
java.time
。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 1 :(得分:0)
可能您可以尝试设置语言环境
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);