如何将2018-04-10T04:00:00.000Z字符串转换为DateTime?

Mig*_*rra 4 java datetime datetime-format android-studio

我从JSON API获得一个日期,看起来像这样的"2018-04-10T04:00:00.000Z".我想转换它以获得Date或String对象并获得类似"01-04-2018"的"dd-MM-YYYY".我该怎么做?

Tam*_*Rev 25

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

我们的想法是定义两种格式:一种用于输入格式,另一种用于输出格式.使用输入格式化程序进行解析,然后使用输出格式化程序进行格式化.

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

输出格式更简单:"dd-MM-yyyy".介意小 - y.

这是示例代码:

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
Run Code Online (Sandbox Code Playgroud)

原始答案 - 使用旧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
Run Code Online (Sandbox Code Playgroud)

  • 请不要教年轻人使用长期过时和臭名昭着的'SimpleDateFormat`类.至少不是第一选择.而且没有任何保留.今天我们在[`java.time`,现代Java日期和时间API](https://docs.oracle.com/javase/tutorial/datetime/)及其`DateTimeFormatter`方面做得更好.是的,您可以在Android上使用它.对于较旧的Android,请参阅[如何在Android项目中使用ThreeTenABP](/sf/ask/2724592811/). (3认同)
  • `LocalDate.parse("2018-04-10T04:00:00.000Z",DateTimeFormatter.ISO_OFFSET_DATE_TIME)`效果很好,给出了'2018-04-10`.`Z`是一个完全有效的偏移,广泛使用而不是+00:00. (2认同)
  • 根据 [ISO 8601 的定义](https://en.wikipedia.org/wiki/ISO_8601#Cooperative_Universal_Time_(UTC)),“Z”表示日期/时间采用 UTC 格式。正如 OleVV 所说,当偏移量为零(+00:00)时可以使用它。在引号内使用带有“Z”的“SimpleDateFormat”,可以将 Z 解析为文字(字母 Z),而不是将其解析为零偏移量。问题是,在这种情况下,“SimpleDateFormat”将使用 JVM 默认时区,而“Date”将对应于错误的时间点。 (2认同)

Deb*_*was 10

使用日期模式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);
Run Code Online (Sandbox Code Playgroud)

更新: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);
Run Code Online (Sandbox Code Playgroud)

在 app/build.gradle 文件中,添加如下 -

dependencies {    
    compile 'joda-time:joda-time:2.9.4'
}
Run Code Online (Sandbox Code Playgroud)

  • Joda-Time 是一个非常好的图书馆。“Joda-Time 被认为是一个基本上“完成”的项目。...如果使用 Java SE 8,请迁移到 java.time (JSR-310)。” 引自[Joda-Time 主页](http://www.joda.org/joda-time/)。所以我推荐 ThreeTenABP 而不是 Joda-Time。 (2认同)