如何将“2021-05-14T13:42:48.000Z”字符串转换为日期对象?

时间:2021-05-14 10:39:30

标签: android date

我正在尝试将“2021-05-14T13:42:48.000Z”字符串转换为日期对象。

我已经试过了:

DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DDHH:MM:SS");

还有这个,我只在 stackoverflow 上看到过:-

DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DD'T'HH:MM:SS'A'");

但都没有奏效。

如何将此字符串转换为我的日期对象?

3 个答案:

答案 0 :(得分:1)

您错误地使用了日期时间格式。请务必注意,日期时间格式在大小写字母之间具有不同的含义。

例如:大写MM表示月,小mm表示分钟

要了解有关日期格式的更多信息,您可以参考: https://cheatography.com/pezmat/cheat-sheets/date-time-formats/pdf/

或者这个: https://devhints.io/datetime

您的情况的答案是:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

答案 1 :(得分:1)

假设您的日期字符串始终表示 UTC 时间(带有“Z”),您可以使用格式字符串:

yyyy-MM-dd'T'HH:mm:ss.SSSZ

但您首先需要将日期字符串中的 Z 替换为固定时区“+0000”,如“2021-05-14T13:42:48.000+0000”。

试试这个:

String myDateString = "2021-05-14T13:42:48.000Z"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
Date myDate = dateFormat.parse (myDateString.replace("Z","+0000"));

这将返回根据您当前时区正确调整的日期,在我的情况下是美国东部时间上午 9:42:48。

Converting ISO 8601-compliant String to java.util.Date 中有更详细的讨论,您可能会觉得有用。

答案 2 :(得分:1)

请不要使用 SimpleDateFormat 甚至 java.date。所有这些类都已弃用。

相反,依靠 Android 可用的 java.time 软件包。

简而言之:

val source = "2021-05-14T13:42:48.000Z"
val parsed = ZonedDateTime.parse(source)

这将正确解析时区(Z 代表祖鲁语/UTC/GMT)。

您可以验证这一点,只需将 parsed 分区日期时间转换为例如欧洲/阿姆斯特丹时间(+2)。

val source = "2021-05-14T13:42:48.000Z"
val parsed = ZonedDateTime.parse(source)

parsed.toString() // prints: 2021-05-14T13:42:48Z
parsed.zone // prints: "Z" 
ZoneId.of(parsed.zone.id) // returns the ZoneOffset "Z" (correct)

// Convert to Amsterdam Time

val amsterdamDateTime = parsed.withZoneSameInstant(ZoneId.of("Europe/Amsterdam"))

amsterdamDateTime.toString() // prints: 2021-05-14T15:42:48+02:00[Europe/Amsterdam] (2 hours ahead of the Zulu time, also correct).

parsed.format(DateTimeFormatter.ISO_DATE_TIME).toString() // Prints: 2021-05-14T13:42:48Z (correct)

如您所见,这些类做正确的事情(大部分时间)。

我建议你使用它们。