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

时间:2019-12-06 11:05:34

标签: java android utc datetime-parsing

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

3 个答案:

答案 0 :(得分:1)

您可以使用A设置日期格式。检查以下内容:

template< class T1, class T2, template<class> class B1, class NA1>

答案 1 :(得分:1)

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或其他适当的日期/时间对象。仅在界面中需要字符串时才转换为字符串。

问题: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;请参阅底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 2 :(得分:0)

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