Java 时间,无法从纪元秒解析年份
Java time, can't parse Year from Epoch Seconds
我正在尝试将 1523265822618
解析为时间字符串。然而,它确实适用于除年份之外的所有内容。是我做错了什么还是 Java 行为很奇怪?
long millis = job.lastBuild.timestamp * 1000
Date date = new Date(millis)
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd MMMM, yyyy HH:mm:ss", Locale.GERMANY);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
echo """${formattedDate}"""
>>> Samstag, 16 Mai, 50240 11:10:18
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(job.lastBuild.timestamp, 0, ZoneOffset.UTC)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE, dd MMMM, yyyy, HH:mm:ss", Locale.GERMANY)
formattedDate = dateTime.format(formatter)
echo """${formattedDate}"""
>>> Samstag, 16 Mai, +50240, 11:10:18
正确的输出是Samstag, 16 Mai, 2018, 11:10:18
抱歉,错误距离屏幕 40 厘米,job.lastBuild.timestamp
已经毫秒多亏了 MadProgrammer
问题出在 job.lastBuild.timestamp
。以下代码工作正常:
Date date = new Date(1523265822618L)
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd MMMM, yyyy HH:mm:ss", Locale.GERMANY);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
结果:Montag,2018 年 4 月 9 日09:23:42
你说的数字,1523265822618,已经是毫秒了。你的错误是乘以 1000 造成的。只是不要这样做。
long millis = 1_523_265_822_618L;
System.out.println(Instant.ofEpochMilli(millis));
2018-04-09T09:23:42.618Z
System.out.println(Instant.ofEpochSecond(millis));
+50240-05-16T11:10:18Z
PS 帮自己和维护代码的人一个忙:不要使用旧的、过时的和麻烦的 类 Date
、SimpleDateFormat
和TimeZone
。坚持使用 java.time,现代 Java 日期和时间 API,就像您的第二个代码片段中一样。
PPS 对于大多数用途,使用内置格式可以提供更广泛接受的结果,也更容易,例如:
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
.withLocale(Locale.GERMANY);
System.out.println(Instant.ofEpochMilli(millis)
.atZone(ZoneId.of("Europe/Berlin"))
.format(formatter));
Montag, 9. April 2018 um 11:23:42 Mitteleuropäische Sommerzeit
我正在尝试将 1523265822618
解析为时间字符串。然而,它确实适用于除年份之外的所有内容。是我做错了什么还是 Java 行为很奇怪?
long millis = job.lastBuild.timestamp * 1000
Date date = new Date(millis)
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd MMMM, yyyy HH:mm:ss", Locale.GERMANY);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
echo """${formattedDate}"""
>>> Samstag, 16 Mai, 50240 11:10:18
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(job.lastBuild.timestamp, 0, ZoneOffset.UTC)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE, dd MMMM, yyyy, HH:mm:ss", Locale.GERMANY)
formattedDate = dateTime.format(formatter)
echo """${formattedDate}"""
>>> Samstag, 16 Mai, +50240, 11:10:18
正确的输出是Samstag, 16 Mai, 2018, 11:10:18
抱歉,错误距离屏幕 40 厘米,job.lastBuild.timestamp
已经毫秒多亏了 MadProgrammer
问题出在 job.lastBuild.timestamp
。以下代码工作正常:
Date date = new Date(1523265822618L)
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd MMMM, yyyy HH:mm:ss", Locale.GERMANY);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
结果:Montag,2018 年 4 月 9 日09:23:42
你说的数字,1523265822618,已经是毫秒了。你的错误是乘以 1000 造成的。只是不要这样做。
long millis = 1_523_265_822_618L;
System.out.println(Instant.ofEpochMilli(millis));
2018-04-09T09:23:42.618Z
System.out.println(Instant.ofEpochSecond(millis));
+50240-05-16T11:10:18Z
PS 帮自己和维护代码的人一个忙:不要使用旧的、过时的和麻烦的 类 Date
、SimpleDateFormat
和TimeZone
。坚持使用 java.time,现代 Java 日期和时间 API,就像您的第二个代码片段中一样。
PPS 对于大多数用途,使用内置格式可以提供更广泛接受的结果,也更容易,例如:
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
.withLocale(Locale.GERMANY);
System.out.println(Instant.ofEpochMilli(millis)
.atZone(ZoneId.of("Europe/Berlin"))
.format(formatter));
Montag, 9. April 2018 um 11:23:42 Mitteleuropäische Sommerzeit