如何将字符串值(以毫秒为单位)转换为日期格式字符串为"2006-01-02T15:04:05Z07:00"
? (包含Z的偏移量)
我相信"2006-01-02T15:04:05Z07:00"
是Golang指定日期时间格式的方式。 ISO 8601格式更精确。实际格式化的字符串就像例如2018-09-19T00:26:42-05:00
。所以使用DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX")
或只是DatetimeFormatter.ISO_OFFSET_DATE_TIME
(格式化器格式化字符串后没有替换)。
这分为两步:
Instant
。Instant
转换为所需的时区并对其进行格式化。挑战在于第二步。偏移有正号或负号的标志,偏移的标准格式选项包括-
或+
(除了偏移零有时写为Z
没有符号)。这是我对整个事情的看法:
ZoneId zone = ZoneId.of("America/Denver");
DateTimeFormatter firstShotFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss'Z'xxx");
String milliseconds = "1136239445000";
Instant pointInTime = Instant.ofEpochMilli(Long.parseLong(milliseconds));
String firstShot = pointInTime.atZone(zone).format(firstShotFormatter);
// Offset should be negative
if (firstShot.contains("Z-")) {
// Remove minus sign from formatted offset
String result = firstShot.replace("Z-", "Z");
System.out.println("Formatted string: " + result);
} else {
throw new IllegalStateException(
"Don’t know how to format a positive offset from UTC");
}
此代码段的输出是:
格式化字符串:2006-01-02T15:04:05Z07:00
我暂时猜到你的Z07:00
的偏移是指北美山地时间,它在1月份偏离-07:00。请检查。我不知道如何处理正偏移,所以我的代码检查它不会发生。
我发现你要求的格式很奇特。它在日期和时间部分之间以其特有的T
重新采用ISO 8601。但据我所知,ISO 8601可以将偏移量作为Z
(零)或签名,例如-07:00
,从不混合使用。您可能想要检查是否可以说服格式化字符串的接收器接受直接的ISO 8601字符串。我发现这个更清洁,最终更易于理解各方。