当前位置: 首页 > 面试题库 >

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

曾阳飙
2023-03-14
问题内容

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

问题答案:

你不需要

您要求的转换很容易是多余的。您要输入类似的字符串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");

得出与上述相同的结果。



 类似资料:
  • 我正在尝试转换一个表示存储在SQLite中的日期的字符串。 日期存储到sqlite中,如下所示: 根据Java文档,方法: 返回此日期的字符串表示形式。格式设置相当于使用具有格式字符串“eee MMM dd hh:mm:ss zzz yyyy”的SimpleDateFormat,看起来类似于“tue Jun 22 13:07:00 PDT 1999”。则使用当前默认时区和区域设置。如果需要控制时区

  • 我正在做一个应用程序,使用API提供数据与时间戳。时间戳如下所示: 如何将这种格式的日期(Tue Jul 13 00:00:00 CEST 2010)转换为Java日期(字符串来自alfresco属性) 用java将字符串转换为日期

  • 问题内容: 我正在尝试将字符串转换为日期格式,我尝试了很多方法来实现此目的,但是没有成功。我的字符串是“ 2012年1月17日”。我想将其转换为“ 2011-10-17”。有人可以告诉我这样做的方法吗?如果您通过示例工作过,那将是真正的帮助! 问题答案:

  • 问题内容: 您如何将此String转换为gson.JsonArray? 这是我的代码: 这是将这个Collections字符串转换为JSonArray的方法吗? 问题答案: 要在JSON数组中包含字符串值,必须记住在Java程序中用反斜杠转义双引号。请参见下面的声明。 您在main()方法中的代码可以正常工作。以下只是对main()方法中的代码的微小修改。 最后,请记住在语句“ com.googl

  • 我将XML作为字符串传递给一个方法,并再次将其转换为XML来完成我的工作。 其正常工作正常,但当出现特殊字符时,如<代码> 我的XML字符串: 我的代码是: 错误: “=”是意外标记。预期标记为“;”。第1行,位置150。 完全错误为: 系统Xml。XmlException未由用户代码处理HResult=-2146232000消息=“=”是意外令牌。预期标记为“;”。第1行,位置150。源=系统。

  • 问题内容: 是否可以将“ 20110210”转换为2011-02-10? 我试过,我得到 我究竟做错了什么? 我有新的SimpleDateFormat(“ yyyy-MM-dd”)而不是新的SimpleDateFormat(“ yyyyMMdd”) 问题答案: 这对我有用,不会引发异常: