我正在尝试将“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'");
但都没有奏效。
如何将此字符串转换为我的日期对象?
答案 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)
如您所见,这些类做正确的事情(大部分时间)。
我建议你使用它们。