package ar.com.javacuriosities.time;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Year;
import java.time.YearMonth;
import java.time.temporal.ChronoField;
import java.time.temporal.IsoFields;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.TemporalQueries;
import java.time.temporal.TemporalQuery;
import java.time.temporal.TemporalUnit;
/*
* El paquete "java.time.temporal" provee un conjunto de interfaces para realizar cálculos sobre fechas, así
* como obtener datos especificos de cada fecha
*
* La interfaz "Temporal" y "TemporalAccessor" están definidas en función de propiedades definidas en "TemporalField", las
* unidades para estas propiedades son "TemporalUnit", para realizar operaciones aritméticas sobre "Temporal" utilizamos
* "TemporalAmount"
*
* ChronoField implements TemporalField: Conjunto standard de propiedades (DAY_OF_MONTH, DAY_OF_YEAR, etc), estas propiedades están pensadas para multiples calendarios
* ChronoUnit implements TemporalUnit: Conjunto standard de unidades (DAYS, MONTHS, YEARS)
*
* IsoFields: Contiene propiedades y unidades especificas para ISO-8601
*
* Otras dos clases que tienen propiedades especificas son WeekFields, JulianFields
*
* Temporal Adjuster:
*
* - La interfaz "TemporalAdjuster" define un método el cual recibe un "Temporal" sobre el cual realizar un ajuste y retorna
* el resultado de la operación
* - La clase "TemporalAdjusters" contiene varios adjusters ya implementados
*
* Temporal Query:
*
* - La interfaz "TemporalQuery" define un método que recibe un "TemporalAccessor" al cual podemos pedirle información y devolver el
* resultado de forma genérica
* - La clase "TemporalQueries" contiene varios queries ya implementados
*/
public class Lesson10TemporalPackage {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
boolean isSupported = date.isSupported(ChronoField.HOUR_OF_DAY);
System.out.println("LocalDate supports Hour of Day? " + isSupported);
System.out.println("Date of month? " + date.get(ChronoField.DAY_OF_MONTH));
System.out.println("Quarter of year? " + date.get(IsoFields.QUARTER_OF_YEAR));
System.out.println("***Temporal Adjusters***");
System.out.println("First day of Month: " + date.with(TemporalAdjusters.firstDayOfMonth()));
System.out.println("First Monday of Month: " + date.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
System.out.println("Last day of Month: " + date.with(TemporalAdjusters.lastDayOfMonth()));
System.out.println("First day of next Month: " + date.with(TemporalAdjusters.firstDayOfNextMonth()));
System.out.println("First day of next Year: " + date.with(TemporalAdjusters.firstDayOfNextYear()));
System.out.println("First day of Year: " + date.with(TemporalAdjusters.firstDayOfYear()));
System.out.println("***Custom Adjusters***");
// Dado que "TemporalAdjuster" es una Functional Interface podes usar lambdas para definir nuestros propios adjusters
System.out.println("Seven day of Month: " + date.with(t -> t.with(ChronoField.DAY_OF_MONTH, 7)));
System.out.println("***Temporal Queries***");
// Esta query retorna el "ChronoUnit" mas chico posible para el tipo solicitado
TemporalQuery<TemporalUnit> query = TemporalQueries.precision();
System.out.println("LocalDate precision is: " + LocalDate.now().query(query));
System.out.println("LocalDateTime precision is: " + LocalDateTime.now().query(query));
System.out.println("Year precision is: " + Year.now().query(query));
System.out.println("YearMonth precision is: " + YearMonth.now().query(query));
System.out.println("Instant precision is: " + Instant.now().query(query));
System.out.println("Is Monday: " + LocalDate.now().query(t -> t.get(ChronoField.DAY_OF_WEEK) == DayOfWeek.MONDAY.getValue()));
}
}