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.
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);
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());
**// 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