Java 8 convertir l'heure et le fuseau horaire donnés en heure UTC

J'ai un temps avec le type de chaîne comme: "2015-01-05 17:00" et ZoneId est "Australia/Sydney".

Comment puis-je convertir ces informations de temps en l'heure UTC correspondante à L'aide de L'API Java 8 datetime?

Aussi besoin de considérer les choses DST.

21
demandé sur Tunaki 2016-01-05 09:44:57

3 réponses

Vous recherchez la classe ZonedDateTime dans Java8 - une date-heure complète avec fuseau horaire et un décalage résolu de UTC / Greenwich. En termes de conception, cette classe doit être considérée principalement comme la combinaison de A LocalDateTime et a ZoneId. Le {[4] } est un élément d'information essentiel, mais secondaire, utilisé pour s'assurer que la classe représente un instant, en particulier lors d'un chevauchement d'heure d'été.

Par exemple:

ZoneId australia = ZoneId.of("Australia/Sydney");
String str = "2015-01-05 17:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter);
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia );

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney);

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC);

System.out.println("Current date and time in UTC : " + utcDate);
39
répondu Mateusz Sroka 2016-01-05 08:17:43

Une alternative à la réponse existante est de configurer le formateur avec le fuseau horaire approprié:

String input = "2015-01-05 17:00";
ZoneId zone = ZoneId.of("Australia/Sydney");

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone);
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC);

Puisque vous voulez interagir avec une base de données, vous pouvez avoir besoin d'un java.sql.Timestamp, auquel cas vous n'avez pas besoin de convertir explicitement en une heure UTC mais pouvez utiliser un Instant à la place:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt);
Timestamp sqlTs = Timestamp.from(zdt.toInstant());
15
répondu assylias 2016-01-05 11:52:05
   **// Refactored Logic**     

        ZoneId australia = ZoneId.of("Australia/Sydney");
        ZoneId utcZoneID= ZoneId.of("Etc/UTC");
        String ausTime = "2015-01-05 17:00";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

        //converting in datetime of java8
        LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter);

        // DateTime With Zone
        ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID);
        // output - 2015-01-05T17:00Z[Etc/UTC]

        // With Formating DateTime
        String utcDateTime = utcDateAndTime.format(formatter);
        // output - 2015-01-05 17:00
0
répondu Mukesh 2017-05-03 06:59:29