【问题标题】:How this "2020-12-31T02:00:00+05:30" string response be convert to 31/12/2020, 02:00 pm in Android Studio?这个“2020-12-31T02:00:00+05:30”字符串响应如何在 Android Studio 中转换为 31/12/2020, 02:00 pm?
【发布时间】:2021-01-21 09:58:08
【问题描述】:

我正在调用一个肥皂网络服务,作为响应,我得到了一个日期,格式为 “2020-12-31T02:00:00+05:30”。

我想将其转换并显示为“31/12/2020, 02:00 AM”。 我该怎么做?

我已经尝试了下面的代码,但它返回的是 null。

            String pattern = "yyyy-MM-dd'T'HH:mm:ss z";
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            try {
                startDate= format.parse(eventStartDate);
            } catch (ParseException e) {
                e.printStackTrace();
            }

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 我相信我今天早些时候以重复的形式关闭了一个相同或几乎相同的问题。请不要再问同样的问题,而是提出一个新问题,说明您的问题与建议的原件有何不同。那我们就来帮忙了。
  • 我没有得到我想要的答案,请打开问题。或者请提供问题的答案。谢谢
  • 我们这里有很多人尽我们所能回答问题。当我们不回答您的问题时,可能是因为您没有充分解释它与已经回答的数千个类似问题有何不同(我不认为我在夸大其词)。而且我认为删除您的已关闭问题、重新发布并要求我们在此处做其他可接受的行为是不可接受的。这也不利于我帮助你的兴趣。
  • 让我看看我是否可以帮助你一点点,不是你的日期字符串转换,而是你在 Stack Overflow 上的行为,假设你有兴趣。我建议您发布一个新问题,链接到我提到的两个原始问题,并在阅读这些问题的 8 个答案后准确说明您仍然缺少什么。还要记住包括您的尝试并解释它以何种方式失败。然后我们可以给你一个答案,它不会只是重复你不想要的那 8 个答案,而是一个你会想要的答案。
  • 查看问题,我还需要更改吗?

标签: android android-studio date datetime-format


【解决方案1】:

java.time 脱糖

考虑为您的日期和时间工作使用现代 Java 日期和时间 API java.time。以下代码将几乎为您提供您所要求的(只有年份只有 2 位数字,时钟小时只有 1 位数字)。优点是我们使用的是内置格式,我们自己不需要为任何格式模式而苦恼——这是您遇到问题的部分。

    DateTimeFormatter displayFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
    
    String fromResponse = "2020-12-31T02:00:00+05:30";
    OffsetDateTime startDateTime = OffsetDateTime.parse(fromResponse);
    String displayDateTimeStr = startDateTime.atZoneSameInstant(ZoneId.systemDefault())
            .format(displayFormatter);
    
    System.out.println(displayDateTimeStr);

我使用 ThreeTen Backport 库(参见底部的链接)在我的桌面 Java 9 上运行代码,默认语言环境设置为 en-IN,默认时区设置为 Asia/Kolkata。输出是:

20 年 12 月 31 日凌晨 2:00

如果您坚持使用四位数年份和两位数小时,请使用模式指定输出格式:

    DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern(
            "dd/MM/uuuu, hh:mm a", Locale.forLanguageTag("en-IN"));

2020 年 12 月 31 日凌晨 02:00

我假设您的用户想要查看其时区的时间,因此我正在使用OffsetDateTime 的atZoneSameInstant 方法进行转换。

问题:java.time 不需要 Android API 26 级吗?

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

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
  • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

你的代码出了什么问题?

您的格式模式字符串中有两个错误:

  1. ss 和 z 之间有一个空格。在响应的字符串中,秒和时区偏移之间没有空格。这导致您的解析失败并显示java.text.ParseException: Unparseable date: "2020-12-31T02:00:00+05:30"。如果您没有看到,则需要修复您的项目设置,以便显示来自您的 e.printStackTrace(); 的输出。
  2. 模式字母z 不接受在小时和分钟之间带有冒号的偏移量,就像在+05:30 中一样。对于旧的和麻烦的SimpleDateFormat,正确的模式应该是大写的XXX。

链接

【讨论】:

  • 感谢您的回答。我比较新鲜,我没有开发 API。我做的错误是“s”和“z”之间的空格,你纠正了。但在那之后,我再次必须转换 GMT 格式时间并获取 AM 和 PM。非常感谢您的代码为我工作。我会尽量了解您在 java.time 上提供的信息。
猜你喜欢
  • 2021-03-30
  • 2021-07-10
  • 2020-09-04
  • 2019-09-27
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多