【问题标题】:Parse UTC time format into readable datetime in android在android中将UTC时间格式解析为可读的日期时间
【发布时间】:2019-12-06 11:05:34
【问题描述】:

我有一个格式为2019-12-06T06:04:50.022461Z 的UTC 日期时间我想转换为格式为dd-mm-yyyy hh:mm:ss 的可读日期时间。我无法转换为特定格式。任何帮助将不胜感激。谢谢

【问题讨论】:

标签: java android utc datetime-parsing


【解决方案1】:

您可以使用SimpleDateFormat 来格式化日期。检查以下:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

Calendar calendar = Calendar.getInstance();

try {
    calendar.setTime(sdf.parse("2019-12-06T06:04:50.022461Z"));
} catch (Exception ex) {
    ex.printStackTrace();
}

SimpleDateFormat returnFormat = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
returnFormat.format(calendar.getTime());

【讨论】:

  • 请不要教年轻人使用早已过时且臭名昭著的麻烦SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。是的,您可以在 Android 上使用它。对于较旧的 Android,请参阅 How to use ThreeTenABP in Android Project
  • 您的代码在我的时区产生06-04-2019 07:04:50。月份应为 12 月,但已更改为 4 月。
【解决方案2】:

java.time 和 ThreeTenABP

我假设您希望在用户的时区中显示时间。正如您已经说过的,您的字符串是 UTC,很少有用户会乐于阅读 UTC 时间。

    DateTimeFormatter readableFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss");

    String originalString = "2019-12-06T06:04:50.022461Z";
    String readableString = Instant.parse(originalString)
            .atZone(ZoneId.systemDefault())
            .format(readableFormatter);
    System.out.println(readableString);

为了示例,我在 America/Sitka 时区运行此代码。输出是:

05-12-2019 21:04:50

如果您确实想在原始字符串中显示 UTC 时间:

    String readableString = OffsetDateTime.parse(originalString)
            .format(readableFormatter);

06-12-2019 06:04:50

不要使用当前接受的答案中使用的 SimpleDateFormatTimeZoneCalendar 类。它们都设计得很糟糕,SimpleDateFormat 特别是一个臭名昭著的麻烦制造者,也不能像你的字符串那样在秒上解析 6 位小数。这三个类也都已经过时了。相反,我使用的是现代 Java 日期和时间 API java.time。与它一起工作要好得多。代码不仅更短,我想你也会发现它读起来更清晰(无论是立即阅读还是在你习惯了流利的风格时)。

我正在利用您的原始字符串采用 ISO 8601 格式这一事实。 java.time 的类默认解析 ISO 8601 格式,即没有任何显式格式化程序。

不过,出于绝大多数目的,您不希望从一种字符串格式转换为另一种格式。在您的程序中,将您的日期和时间保留为 Instant 或其他适当的日期/时间对象。只有在接口需要字符串时才转换为字符串。

问题: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 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    【解决方案3】:

    你可以在 java 8 中试试这个

        String dateString = "2019-12-06T06:04:50.022461Z";
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);
        TemporalAccessor date = fmt.parse(dateString);
        Instant time = Instant.from(date);
    
        DateTimeFormatter fmtOut = DateTimeFormatter.ofPattern("dd-mm-yyyy hh:mm:ss").withZone(ZoneOffset.UTC);
        String newDateString = fmtOut.format(time);
    

    【讨论】:

    • 你的代码给了我java.time.format.DateTimeParseException: Text '2019-12-06T06:04:50.022461Z' could not be parsed, unparsed text found at index 10。使用现代 Java 日期和时间 API java.time 是个好主意。
    • @OleV.V.为什么不给出示例代码来解析它。谢谢
    • @Piyush 我一直在犹豫是否要这样做,因为这是一个糟糕的问题,而且它与许多其他问题的重复。所以我首先在 cmets 中提供了一些链接。现在我已按照您的要求发布了我的答案。
    • @OleV.V.感谢您的信息!!和你的答案
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2016-05-22
    • 2021-10-14
    相关资源
    最近更新 更多