Java时间,无法从纪元解析年份

时间:2018-08-14 06:50:19

标签: java datetime time datetime-format java-time

我正在尝试将mysql解析为A时间字符串。但是,它适用于除Year以外的所有内容。我是在做错什么,还是Java行为异常?

1523265822618

正确的输出为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

对不起,错误距屏幕40厘米,Samstag, 16 Mai, 2018, 11:10:18已经毫秒,这要归功于MadProgrammer

2 个答案:

答案 0 :(得分:1)

您提到的数字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帮您自己和那些维护您代码后的人:不要使用旧的,过时且麻烦的类DateSimpleDateFormatTimeZone。像第二个代码段一样,坚持使用现代的Java日期和时间API java.time。

PPS对于大多数用途,使用内置格式可提供更广泛接受的结果,并且更容易实现,例如:

        DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
                .withLocale(Locale.GERMANY);
        System.out.println(Instant.ofEpochMilli(millis)
                .atZone(ZoneId.of("Europe/Berlin"))
                .format(formatter));
  

蒙塔格,2018年4月9日um 11:23:42MitteleuropäischeSommerzeit

答案 1 :(得分:0)

问题出在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);

结果:蒙塔格,2018年4月9日09:23:42