ZonedDateTime.ofInstant 不显示秒

Gui*_*ves 1 java datetime

我试图使用 ZonedDateTime.ofInstant 给出特定的日期时间来获取时间,但是我注意到在某些情况下给出的结果不包含秒。代表我正在处理的情况的代码示例

import java.time.*;
  
public class GFG {
    public static void main(String[] args)
    {
  
  
        
        // create a long variable for milliseconds
        //this is the same as "2022-01-31T00:00:00.00Z"
        long milliseconds1  = 1643587200000L;
        long milliseconds2  = 1643587201000L;
            

        // get Instant using ofEpochMilli() method
        Instant instant1
            = Instant.ofEpochMilli(milliseconds1); 
        // create Instant object
        Instant instant2
            = Instant.ofEpochMilli(milliseconds2);
  
        // create a ZonID
        ZoneId zone = ZoneId.of("Europe/Lisbon");
  
        // apply ofInstant method
        // of ZonedDateTime class
        ZonedDateTime zt1 = ZonedDateTime
                               .ofInstant(instant1, zone);
        ZonedDateTime zt2 = ZonedDateTime
                                .ofInstant(instant2, zone);
  
        // print the result
        System.out.println("ZonedDateTime is " + zt1);
        System.out.println("ZonedDateTime is " + zt2);
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码执行的结果如下:

ZonedDateTime is 2022-01-31T00:00Z[Europe/Lisbon]
ZonedDateTime is 2022-01-31T00:00:01Z[Europe/Lisbon]
Run Code Online (Sandbox Code Playgroud)

我需要获取第一个结果中未显示的秒数,但我无法理解为什么它没有显示 ZonedDateTime.ofInstant 是否有理由不给出完整时间,或者是否有其他方法来获取时间YYYY-MM-DD:HH:MM:SS 中的特定时区?

Jon*_*eet 5

您只是使用默认toString()实现,默认实现又使用默认LocalDateTime.toString()实现,其记录为:

输出将是以下 ISO-8601 格式之一:

  • uuuu-MM-dd'T'HH:mm
  • uuuu-MM-dd'T'HH:mm:ss
  • uuuu-MM-dd'T'HH:mm:ss.SSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS

使用的格式将是输出时间的完整值的最短格式,其中省略的部分隐含为零。

如果您想要非默认格式(听起来像您所做的那样),则需要使用DateTimeFormatter. 我怀疑DateTimeFormatter.ISO_ZONED_DATE_TIME可以满足您的要求 - 但如果没有,只需构建一个具有您想要的确切格式的格式即可。

示例代码:

import java.time.*;
import java.time.format.*;

public class Test {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochMilli(1643587200000L);
        ZoneId zone = ZoneId.of("Europe/Lisbon");
        ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, zone);
        DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
        System.out.println(formatter.format(zdt));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2022-01-31T00:00:00Z[Europe/Lisbon]
Run Code Online (Sandbox Code Playgroud)