这个“2020-12-31T02:00:00+05:30”字符串响应如何在Android Studio中转换为31/12/2020, 02:00 pm?

时间:2021-01-21 09:58:08

标签: android android-studio date datetime-format

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

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

我尝试了下面的代码,但它返回空值。

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

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

1 个答案:

答案 0 :(得分:1)

java.time 通过脱糖

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

    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,默认时区设置为亚洲/加尔各答。输出是:

<块引用>

31/12/20,凌晨 2:00

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

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

31/12/2020,凌晨 02:00

我假设您的用户想要查看其时区的时间,因此我使用 atZoneSameInstantOffsetDateTime 方法执行转换。

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

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

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

您的代码出了什么问题?

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

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

链接