【问题标题】:How do I convert 2018-04-10T04:00:00.000Z string to DateTime? [duplicate]如何将 2018-04-10T04:00:00.000Z 字符串转换为 DateTime? [复制]
【发布时间】:2018-09-19 23:39:28
【问题描述】:

我从一个类似于“2018-04-10T04:00:00.000Z”的 JSON API 获得一个日期。我想对其进行转换以获得日期或字符串对象并获得类似于“01-04-2018”的“dd-MM-YYYY”。我该怎么做?

【问题讨论】:

  • 使用SimpleDateFormat
  • ...或使用 Java 8 日期 API。无论哪种方式,这都是重复的。
  • @Arvind 请不要教年轻人使用早已过时且臭名昭著的麻烦 SimpleDateFormat 类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中有很多更好的东西。是的,您可以在 Android 上使用它。对于较旧的 Android,请参阅 How to use ThreeTenABP in Android Project
  • 发帖前搜索 Stack Overflow。您可以假设所有基本的日期时间问题都已被询问和回答。

标签: java android-studio datetime datetime-format


【解决方案1】:

更新:使用 DateTimeFormat,在 java 8 中引入:

这个想法是定义两种格式:一种用于输入格式,一种用于输出格式。使用输入格式化程序进行解析,然后使用输出格式化程序进行格式化。

您的输入格式看起来很标准,除了结尾的Z。无论如何,让我们处理这个问题:"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"。尾随的'Z' 是有趣的部分。通常这里有时区数据,比如-0700。所以模式是...Z,即没有撇号。

输出格式更简单:"dd-MM-yyyy"。注意小y -s。

示例代码如下:

DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd-MM-yyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse("2018-04-10T04:00:00.000Z", inputFormatter);
String formattedDate = outputFormatter.format(date);
System.out.println(formattedDate); // prints 10-04-2018

原始答案 - 使用旧 API SimpleDateFormat

SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date = inputFormat.parse("2018-04-10T04:00:00.000Z");
String formattedDate = outputFormat.format(date);
System.out.println(formattedDate); // prints 10-04-2018

【讨论】:

  • 请不要教年轻人使用陈旧过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中有很多更好的。是的,您可以在 Android 上使用它。对于较旧的 Android,请参阅 How to use ThreeTenABP in Android Project
  • 对,先生,更新了答案。
  • 承认和赞成,塔马斯。作为输入格式化程序,你可以使用DateTimeFormatter.ISO_OFFSET_DATE_TIME,所以你不需要自己滚动。
  • LocalDate.parse("2018-04-10T04:00:00.000Z", DateTimeFormatter.ISO_OFFSET_DATE_TIME) 工作得很好,并提供2018-04-10Z 是一个完全有效的偏移量,被广泛使用而不是 +00:00。
  • Z 表示日期/时间为 UTC,根据ISO 8601's definition。正如 OleVV 所说,它可以在偏移量为零(+00:00)时使用。在引号内使用 SimpleDateFormatZ 使其将 Z 解析为文字(字母 Z),而不是将其解析为零偏移量。问题是,在这种情况下,SimpleDateFormat 将使用 JVM 默认时区,而Date 将对应一个错误的时间点。
【解决方案2】:

使用日期模式 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 和 Java 8 你可以做到

String string = "2018-04-10T04:00:00.000Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date);

更新: 26 岁前使用 Joda 时间

String string = "2018-04-10T04:00:00.000Z";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
LocalDate date = org.joda.time.LocalDate.parse(string, formatter);

在 app/build.gradle 文件中,像这样添加-

dependencies {    
    compile 'joda-time:joda-time:2.9.4'
}

【讨论】:

  • 效果很好,但此调用需要我的 Android 应用程序上的 API 级别 26(当前最低为 15),我现在不想更改它。还有其他选择吗?
  • 这也适用于较旧的 Android。对于 pre-level-26,请参阅How to use ThreeTenABP in Android Project
  • 由于字符串是 ISO 8601 格式,您甚至不需要显式格式化程序。 java.time 类将此格式解析为默认格式。 LocalDate date = OffsetDateTime.parse(string).toLocalDate().
  • Joda-Time 是一个非常好的库。 “Joda-Time 被认为是一个基本上“完成”的项目。 …如果使用 Java SE 8,请迁移到 java.time (JSR-310)。”引用自the Joda-Time homepage。所以我推荐 ThreeTenABP 而不是 Joda-Time。
  • 这个答案忽略了me区的关键问题。对于任何特定时刻,日期会因地区而异在全球各地。
猜你喜欢
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2020-08-04
  • 2020-05-01
相关资源
最近更新 更多