将 UTC 时间格式解析为 android 中的可读日期时间

Parse UTC time format into readable datetime in android

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

你可以在 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);

您可以使用 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());

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.time,现代 Java 日期和时间 API。与它一起工作要好得多。代码不仅更短,我想你也会发现阅读起来更清晰(立即或当你习惯了流畅的风格)。

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

不过,对于绝大多数用途,您不希望从一种字符串格式转换为另一种字符串格式。在您的程序中,将您的日期和时间保存为 Instant 或其他适当的 date/time 对象。只有在界面中需要字符串的时候才转为字符串。

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

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

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接