在 Java 8 中获取当前时间

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33100130/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 14:19:41  来源:igfitidea点击:

Getting current time in Java 8

javajava-8java-time

提问by user2693135

I am exploring the new java.time API of Java 8. I am particularly trying to retrieve the current time (my current time zone, of a different time zone, and of a different offset).

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

The code is:

代码是:

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);
}

But, when I call the methods I get the same time-of-day (my system time), which is obviously not what I am expecting.

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

The output of the method calls:

方法调用的输出:

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

Even after setting a different time zone and offset, why am I getting the same time?

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

回答by assylias

LocalDateTime.now()always returns the current date/time in your default timezone (say 13 October @ 11.20am in London). When you create a ZonedDateTimeor OffsetTimefrom it with a specific ZoneIdor ZoneOffset, you get the same date and time but in a different time zone (for example 13 october at 11.20am in Los Angeles), which represents a different instant in time.

LocalDateTime.now()始终返回默认时区中的当前日期/时间(比如伦敦的 10 月 13 日 @ 11.20am)。当您使用特定的or创建 a ZonedDateTimeor 时,您将获得相同的日期和时间,但位于不同的时区(例如,洛杉矶的 10 月 13 日上午 11 点 20 分),这代表了不同的时刻。OffsetTimeZoneIdZoneOffset

You are probably looking for something like:

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

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

This will calculate the current date and time in Los Angeles: 13 october, 3.20am.

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

回答by Tunaki

Consider the following fixed methods:

考虑以下固定方法:

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);
}

What changed is that instead of calling now(), the call is made to now(zone). That is because now()always return the current system time in your time-zone. The calls to atZone, OffsetTime.ofor ZoneDateTime.ofdo not change the date/time, it only tells Java Time that the date should be understood at a date/time in this timezone.

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

When calling these 3 methods, here's the output on my machine:

调用这 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

To make this very clear: you're in Europe and call LocalDateTime.now().atZone(ZoneId.of("America/Los_Angeles"))- you are creating a date/time which represents the current-time in Europe as if you were located in Los Angeles, so you are creating a date/time which is actually in the futurefor Los Angeles residents (8 or 9 hours in the future, depending on DST).

明确地说:您在欧洲并打电话LocalDateTime.now().atZone(ZoneId.of("America/Los_Angeles"))- 您正在创建一个日期/时间来表示欧洲的当前时间,就好像您位于洛杉矶一样,因此您正在创建一个实际上的日期/时间洛杉矶居民的未来未来8 或 9 小时,取决于夏令时)。

回答by mlewandowski

There is also another way of displaying time in another zone by using withZoneSameInstant:

还有另一种显示另一个区域的时间的方法withZoneSameInstant

// now, in current zone,
// 2016-04-13T14:24:57.618+02:00[Europe/Warsaw]
ZonedDateTime now = ZonedDateTime.now();

// 2016-04-13T05:24:57.618-07:00[America/Los_Angeles]
ZonedDateTime losAngelesDateTime = now.withZoneSameInstant(ZoneId.of("America/Los_Angeles"));