【问题标题】:Java time, can't parse Year from Epoch SecondsJava时间,无法从纪元秒解析年份
【发布时间】:2018-08-14 06:50:18
【问题描述】:

我正在尝试将1523265822618 解析为时间字符串。但是,它确实适用于除 Year 之外的所有内容。是我做错了什么还是 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 厘米,感谢 MadProgrammer,job.lastBuild.timestamp 已经是毫秒

【问题讨论】:

  • 1523265822618 毫秒吗?纳秒?秒?
  • 我计算毫秒时您可能会看到的秒数;)
  • LocalDateTime dateTime = LocalDateTime.ofEpochSecond(1523265822618L / 1000, 0, ZoneOffset.UTC); 将导致 Monday, 09 April, 2018, 09:23:42(抱歉,删除了语言环境)
  • 所以,LocalDateTime.ofEpochSecond 的 JavaDocs 说 "epochSecond 从 1970-01-01T00:00:00Z 开始的秒数" 所以你需要转换你的“毫秒”值改为“秒”,这可以解释为什么我之前的评论似乎有效
  • 您是无法看到您的时间戳确实以秒为单位,而正确的日期确实在 50240 年,或者您的期望是错误的,时间戳实际上已经以毫秒为单位,而实际日期更合理的是2018年4月9日。

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


【解决方案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.time,这是现代 Java 日期和时间 API,就像在您的第二个代码 sn-p 中一样。

PPS 在大多数情况下,使用内置格式可以得到更广泛接受的结果,也更容易,例如:

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

Montag,2018 年 4 月 9 日 um 11:23:42 Mitteleuropäische Sommerzeit

【讨论】:

    【解决方案2】:

    问题在于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

    【讨论】:

    • 所以L 不见了?
    • 检查job.lastBuild.timestamp的值可能是错误的或者已经是毫秒值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多