有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

datetime Java time,无法从历元秒解析年份

我正在尝试将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


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    你提到的数字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

    请帮个忙:不要使用陈旧、过时且麻烦的类DateSimpleDateFormatTimeZone。坚持使用java。时间,现代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