首页 > 解决方案 > 如何在android中将任何类型的日期转换为特定格式?

问题描述

从服务器接收的日期不固定为特定格式,那么我如何检测正在获取的格式,以便我可以将其转换为特定的日期格式并根据功能显示在应用程序中。

以下是一些收到的示例:

2018-09-10T10:35:00.377Z
2018-09-10T10:35:00.12Z
2018-09-10

提前致谢!

标签: javaandroiddate

解决方案


java.time

    String[] exampleStrings = {
            "2018-09-10T10:35:00.377Z",
            "2018-09-10T10:35:00.12Z",
            "2018-09-10"
    };

    for (String example : exampleStrings) {
        if (example.contains("T")) {
            OffsetDateTime dateTime = OffsetDateTime.parse(example);
            System.out.println("Date: " + dateTime.toLocalDate() 
                    + " Time: " + dateTime.toLocalTime() 
                    + " Offset: " + dateTime.getOffset());
        } else {
            LocalDate date = LocalDate.parse(example);
            System.out.println("Date: " + date);
        }
    }

您的格式是 ISO 8601 允许的变体。java.time,现代 Java 日期和时间 API,无需任何显式格式化程序即可解析这些格式。前两个示例字符串具有日期和时间以及T将它们分开的特征,以及与 UTC 的偏移量(Z表示偏移量 0)。第三个只有一个日期。所以测试字符串中是否有T,其余的使用对应的 java.time 类。

上述代码段的输出是:

Date: 2018-09-10 Time: 10:35:00.377 Offset: Z
Date: 2018-09-10 Time: 10:35:00.120 Offset: Z
Date: 2018-09-10

我不知道您将如何处理这两种不同的类型OffsetDateTime以及LocalDate其他代码。如果您不需要时间部分,只需要日期,请使用dateTime.toLocalDate()获取 aLocalDate并在所有情况下传递此类型。由于您确实需要时间部分,因此根据您的情况和要求,您可以避免相反的转换:在日期情况下,您可能会得到OffsetDateTimefrom 例如date.atStartOfDay().atOffset(ZoneOffset.UTC),但请检查这是否给您适当的时间。

不过,我确实同意 Khemraj 现在删除的答案,即您的服务器应该能够提供一种一致的格式,或者至少指出它为您提供的格式。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备上(我听说从 API 级别 26 开始),现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接


推荐阅读