我正在探索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
即使设定了不同的时区和偏移量,为什么我会得到相同的时间?
答案 0 :(得分:21)
LocalDateTime.now()
始终返回默认时区的当前日期/时间(例如10月13日伦敦上午11点20分)。当您使用特定ZonedDateTime
或OffsetTime
创建ZoneId
或ZoneOffset
时,您会获得相同的日期和时间,但位于不同的时区(例如10月13日)在洛杉矶的上午11点20分,这代表了一个不同的时刻。
你可能正在寻找类似的东西:
Instant now = Instant.now();
ZoneId zoneId = ZoneId.of("America/Los_Angeles");
ZonedDateTime dateAndTimeInLA = ZonedDateTime.ofInstant(now, zoneId);
这将计算洛杉矶的当前日期和时间:10月13日,凌晨3点20分。
答案 1 :(得分:6)
考虑以下固定方法:
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)
。这是因为now()
始终返回您所在时区的当前系统时间。对atZone
,OffsetTime.of
或ZoneDateTime.of
的调用不会更改日期/时间,它只会告知Java Time应在此时区的日期/时间理解日期。
调用这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
要明确这一点:你在欧洲并致电LocalDateTime.now().atZone(ZoneId.of("America/Los_Angeles"))
- 您正在创建一个日期/时间,代表您在欧洲的当前时间,就像您位于洛杉矶一样,因此您正在创建洛杉矶居民实际未来的日期/时间(未来8或9小时,具体取决于夏令时)。
答案 2 :(得分:6)
还有另一种使用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"));