web-dev-qa-db-fra.com

Obtenir l'heure actuelle en Java 8

J'explore la nouvelle API Java.time de Java 8. J'essaie en particulier de récupérer l'heure actuelle (mon fuseau horaire actuel, d'un fuseau horaire différent et d'un décalage différent).

Le code est:

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

Mais, lorsque j'appelle les méthodes, j'obtiens la même heure (l'heure de mon système), ce qui n'est évidemment pas ce à quoi je m'attends.

La sortie de la méthode appelle:

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

Même après avoir défini un fuseau horaire et un décalage différents, pourquoi ai-je la même heure?

15
user2693135

LocalDateTime.now() renvoie toujours la date/heure actuelle dans votre fuseau horaire par défaut (disons le 13 octobre à 11 h 20 à Londres). Lorsque vous créez un ZonedDateTime ou OffsetTime avec un ZoneId ou ZoneOffset spécifique, vous obtenez la même date et l'heure mais dans un fuseau horaire différent ( par exemple le 13 octobre à 11h20 à Los Angeles), ce qui représente un instant différent dans le temps.

Vous cherchez probablement quelque chose comme:

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

Cela permettra de calculer la date et l'heure actuelles à Los Angeles: 13 octobre, 03h20.

21
assylias

Considérez les méthodes fixes suivantes:

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

Ce qui a changé, c'est qu'au lieu d'appeler now() , l'appel est passé à now(zone) . En effet, now() renvoie toujours l'heure actuelle du système dans votre fuseau horaire. Les appels à atZone, OffsetTime.of Ou ZoneDateTime.of Ne modifient pas la date/l'heure, il indique uniquement Java Heure à laquelle la date doit être compris à une date/heure dans ce fuseau horaire.

Lors de l'appel de ces 3 méthodes, voici la sortie sur ma machine:

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

Pour être très clair: vous êtes en Europe et appelez LocalDateTime.now().atZone(ZoneId.of("America/Los_Angeles")) - vous créez une date/heure qui représente l'heure actuelle en Europe comme si vous étiez à Los Angeles, donc vous créez un date/heure qui est réellement dans le futur pour les résidents de Los Angeles (8 ou 9 heures dans le futur, selon l'heure d'été).

7
Tunaki

Il existe également une autre façon d'afficher l'heure dans une autre zone en utilisant 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"));
6
mlewandowski