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月7:00。请检查一下。我不知道如何处理正偏移量,所以我的代码检查它是否发生。 我觉得你要求的格式很奇怪。它的特性符合iso8601标准 T 在日期和时间之间。但据我所知,ISO8601会有偏移量 Z (表示零)或有符号,例如 -07:00 从来没有混合过。您可能需要检查是否可以说服格式化字符串的接收者接受直接的ISO8601字符串。我会发现这更干净,最终更容易理解各方。
1条答案
按热度按时间eimct9ow1#
编辑:您的字符串是占位符字符串
我相信
"2006-01-02T15:04:05Z07:00"
是golang指定日期时间格式的方法。更准确地说是iso8601格式。实际格式化的字符串如下所示2018-09-19T00:26:42-05:00
. 所以使用DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX")
或者只是DatetimeFormatter.ISO_OFFSET_DATE_TIME
(格式化程序格式化字符串后不进行替换)。原始答案
这分为两个步骤:
将毫秒字符串(我假设从1970-01-01的纪元起)转换为
Instant
.转换
Instant
到所需的时区并格式化它。挑战在于第二步。偏移有正负号,偏移的标准格式选项包括
-
或者+
(除了偏移量0有时写为Z
没有标志)。我想说的是:此代码段的输出是:
格式化字符串:2006-01-02t15:04:05z07:00
我初步猜测你方
Z07:00
指北美山地时间,偏移量为1月7:00。请检查一下。我不知道如何处理正偏移量,所以我的代码检查它是否发生。我觉得你要求的格式很奇怪。它的特性符合iso8601标准
T
在日期和时间之间。但据我所知,ISO8601会有偏移量Z
(表示零)或有符号,例如-07:00
从来没有混合过。您可能需要检查是否可以说服格式化字符串的接收者接受直接的ISO8601字符串。我会发现这更干净,最终更容易理解各方。链接
维基百科上的iso 8601
在golang中格式化日期和时间