如何在Android中将任何类型的Date转换为特定格式?

时间:2018-09-10 09:33:55

标签: java android date

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

以下是一些收到的示例:

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

提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

我不知道您将如何处理其余代码中的两种不同类型的OffsetDateTimeLocalDate。如果您不需要时间部分,只需要日期,请使用dateTime.toLocalDate()来获取LocalDate,然后在所有情况下都将其传递给您。由于您确实需要时间部分,因此,根据您的情况和要求,您可以摆脱相反的转换:在日期情况下,您可能会从OffsetDateTime等中获得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,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接