获取 Java 8 中的当前时间

2022-09-03 09:35:05

我正在探索Java 8的新java.time API。我特别尝试检索当前时间(我的当前时区,不同时区和不同偏移量)。

代码是:

public static void getCurrentLocalTime(){
    LocalTime time = LocalTime.now();
    System.out.println("Local Time Zone: "+ZoneId.systemDefault().toString());
    System.out.println("Current local time : " + time);
}

public static void getCurrentTimeWithTimeZone(){
    LocalDateTime localtDateAndTime = LocalDateTime.now();
    ZoneId zoneId = ZoneId.of("America/Los_Angeles");
    ZonedDateTime dateAndTimeInLA  = ZonedDateTime.of(localtDateAndTime, zoneId);
    String currentTimewithTimeZone =dateAndTimeInLA.getHour()+":"+dateAndTimeInLA.getMinute();
    System.out.println("Current time in Los Angeles: " + currentTimewithTimeZone);
}

public static void getCurrentTimeWithZoneOffset(){
    LocalTime localtTime = LocalTime.now();
    ZoneOffset offset = ZoneOffset.of("-08:00");
    OffsetTime  offsetTime  = OffsetTime.of(localtTime, offset);
    String currentTimewithZoneOffset =offsetTime.getHour()+":"+offsetTime.getMinute();
    System.out.println("Current time  with offset -08:00: " + currentTimewithZoneOffset);
}

但是,当我调用这些方法时,我得到的是一天中相同的时间(我的系统时间),这显然不是我所期望的。

该方法的输出调用:

Current time in Los Angeles: 19:59
Local Time Zone: Asia/Calcutta
Current local time : 19:59:20.477
Current time  with offset -08:00: 19:59

即使设置了不同的时区和偏移量,为什么我得到相同的时间?


答案 1

LocalDateTime.now()始终返回默认时区的当前日期/时间(例如 10 月 13 日 @ 伦敦的上午 11:20)。当您使用特定的 或 创建或时,您将获得相同的日期和时间,但时区不同(例如,10 月 13 日上午 11:20 在洛杉矶),这表示不同的时间点。ZonedDateTimeOffsetTimeZoneIdZoneOffset

您可能正在寻找类似的东西:

Instant now = Instant.now();
ZoneId zoneId = ZoneId.of("America/Los_Angeles");
ZonedDateTime dateAndTimeInLA = ZonedDateTime.ofInstant(now, zoneId);

这将计算洛杉矶的当前日期和时间:10月13日,凌晨3点20分。


答案 2

请考虑以下固定方法:

public static void getCurrentLocalTime() {
    LocalTime time = LocalTime.now();
    System.out.println("Local Time Zone: " + ZoneId.systemDefault().toString());
    System.out.println("Current local time : " + time);
}

public static void getCurrentTimeWithTimeZone() {
    LocalDateTime localDateAndTime = LocalDateTime.now(ZoneId.of("America/Los_Angeles"));
    System.out.println("Current time in Los Angeles: " + localDateAndTime.toLocalTime());
}

public static void getCurrentTimeWithZoneOffset() {
    LocalTime localTime = LocalTime.now(ZoneOffset.of("-08:00"));
    System.out.println("Current time  with offset -08:00: " + localTime);
}

改变的是,不是调用 now(),而是调用 now(zone)。这是因为始终以您所在的时区返回当前系统时间。调用 ,或者不更改日期/时间,它只告诉 Java Time,应该在这个时区的某个日期/时间理解日期。now()atZoneOffsetTime.ofZoneDateTime.of

调用这 3 个方法时,下面是我计算机上的输出:

Local Time Zone: Europe/Paris
Current local time : 12:32:21.560
Current time in Los Angeles: 03:32:21.579
Current time  with offset -08:00: 02:32:21.580

为了非常清楚地说明这一点:您在欧洲并致电 - 您正在创建一个日期/时间,该日期/时间表示欧洲的当前时间,就好像您位于洛杉矶一样,因此您正在创建一个日期/时间,该日期/时间实际上是洛杉矶居民的未来(未来8或9小时,具体取决于DST)。LocalDateTime.now().atZone(ZoneId.of("America/Los_Angeles"))


推荐