package ar.com.javacuriosities.time;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/*
* Time zone es una region del planeta donde el mismo standard time es usado
* Cada time zone esta descrito por un identificador y usualmente el formato es region/ciudad (Asia/Tokyo) y un offset desde Greenwich/UTC, el offset de Tokyo es +09:00
*
* El API ofrece dos clases básicas para el manejo de time zone
* - ZoneId
* - ZoneOffset
*
* Tenemos tres clases especificas para el manejo de fechas con time zone
* - ZonedDateTime: Combina LocalDateTime con ZoneId, es usada para representar una fecha completa con time zone incluido
* - OffsetDateTime: Combina LocalDateTime con ZoneOffset, es usada para representar una fecha completa con un offset desde el UTC (Coordinated Universal Time)
* - OffsetTime: Combina LocalTime con ZoneOffset, es usada para representar un tiempo especifico (Hora, Minutos, Segundos, Nanosegundos) con un offset desde el UTC
*/
public class Lesson05TimeZoneAndOffsetClasses {
public static void main(String[] args) throws Exception {
LocalDateTime currentLocalDateTime = LocalDateTime.now();
Set<String> allZones = ZoneId.getAvailableZoneIds();
List<String> zoneList = new ArrayList<String>(allZones);
Collections.sort(zoneList);
System.out.println("Original: " + currentLocalDateTime);
for (String zone : zoneList) {
ZoneId zoneId = ZoneId.of(zone);
ZonedDateTime zonedDateTime = currentLocalDateTime.atZone(zoneId);
ZoneOffset offset = zonedDateTime.getOffset();
if (offset.getTotalSeconds() != 0) {
System.out.println(offset + " -> " + zonedDateTime);
}
}
// ZonedDateTime
LocalDateTime leaving = LocalDateTime.of(2013, Month.JULY, 20, 19, 30);
ZoneId leavingZone = ZoneId.of("America/Los_Angeles");
ZonedDateTime departureFlight = ZonedDateTime.of(leaving, leavingZone);
// El vuelo dura 10 horas y 50 minutos, el total es 650 minutos
ZoneId arrivingZone = ZoneId.of("Asia/Tokyo");
ZonedDateTime arrivalFlight = departureFlight.withZoneSameInstant(arrivingZone).plusMinutes(650);
System.out.println("Departure at America/Los_Angeles: " + departureFlight);
System.out.println("Current Time at Asia/Tokyo: " + departureFlight.withZoneSameInstant(arrivingZone));
System.out.println("Arrival: " + arrivalFlight);
// OffsetDateTime
LocalDateTime localDate = LocalDateTime.of(2013, Month.JULY, 20, 19, 30);
ZoneOffset offset = ZoneOffset.of("-08:00");
OffsetDateTime offsetDate = OffsetDateTime.of(localDate, offset);
System.out.println("Date based on offset: " + offsetDate);
}
}