web-dev-qa-db-fra.com

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 horaires en heure UTC correspondante à l'aide de l'API Java 8 datetime?

Il faut aussi tenir compte de l’heure d’été.

28
ttt

Vous recherchez une classe ZonedDateTime en Java8 - une date-heure complète avec fuseau horaire et décalage décalé à partir de UTC/Greenwich. En termes de conception, cette classe doit être considérée principalement comme la combinaison de LocalDateTime et ZoneId. La ZoneOffset est une information essentielle, mais secondaire, utilisée pour garantir que la classe représente un instant, en particulier lors du chevauchement de l'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);
48
Mateusz Sroka

Une alternative à la réponse existante consiste à 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 souhaitez interagir avec une base de données, vous aurez peut-être besoin d'un Java.sql.Timestamp, auquel cas vous n'avez pas besoin de convertir explicitement en heure UTC, mais vous pouvez utiliser un instantané à la place:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt);
Timestamp sqlTs = Timestamp.from(zdt.toInstant());
15
assylias
   **// 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
Mukesh