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

How this "2020-12-31T02:00:00+05:30" string response be convert to 31/12/2020, 02:00 pm in Android Studio?

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

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

我试过下面的代码,但是 return 是空的。

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

如有任何帮助,我们将不胜感激。 谢谢

java.time 通过脱糖

考虑使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。下面的代码将 almost 给你你所要求的(只有年份只有 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);

我 运行 我桌面上的代码 Java 9 使用 ThreeTen Backport 库(请参阅底部的 link),默认语言环境设置为 en-IN 和默认时间区域到 Asia/Kolkata。输出为:

31/12/20, 2:00 AM

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

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

31/12/2020, 02:00 AM

我假设您的用户想要查看他或她所在时区的时间,所以我正在使用 OffsetDateTimeatZoneSameInstant 方法执行转换。

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

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

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 在非Android Java 6 和 7 中得到 ThreeTen Backport,现代 类 的 backport(ThreeTen for JSR 310;参见 links在底部)。
  • 在较早的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 类。

你的代码出了什么问题?

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

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

链接