LocalDateTime
El objeto LocalDateTime es capaz de guardar fecha y hora, pero sin especificación de zona ni offset. Como el resto de objetos de este package, es un objeto inmutable y thread-safe en que que podemos guardar los datos de fecha y hora y acceder a todas las herramientas del paquete
now(), of(),ofEpochSecond(), ofInstant(), parse(), from()
static LocalDateTime now()
static LocalDateTime now(Clock clock)
static LocalDateTime now(ZoneId zone)
static LocalDateTime of(int y, int m, int dayOfM, int h, int min)
static LocalDateTime of(int y, int m, int dayOfM, int h, int min, int second)
static LocalDateTime of(int y, int m, int dayOfM, int h, int min, int second, int nanoOfS)
static LocalDateTime of(int y, Month m, int dayOfM, int h, int min)
static LocalDateTime of(int y, Month m, int dayOfM, int h, int min, int second)
static LocalDateTime of(int y, Month m, int dayOfM, int h, int min, int second, int nanoOfSecond)
static LocalDateTime of(LocalDate date, LocalTime time)
static LocalDateTime ofEpochSecond(long epochS, int nanoOfS, ZoneOffset offset)
static LocalDateTime ofInstant(Instant instant, ZoneId zone)
static LocalDateTime parse(CharSequence text)
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)
static LocalDateTime from(TemporalAccessor temporal)
Crea un objeto LocalDateTime desde diversos orígenes
- Desde el reloj del sistema
- Desde un reloj definido
- Desde el reloj del sistema en la zona indicada
- Pasándole tres enteros correspondientes a año, mes, día, hora y minuto pudiendo indicar también segundo y nanosegundo
- Pasándole los datos anteriores que nos interesen, pero con el mes como objeto de la enumeración Month
- Entregando un LocalDate y un LocalTime
- Indicando el numero de segundos y nano segundos transcurridos desde 1/1/1970, asi como el Offset
- Pasándole un objeto Instant y la zona horaria
- Indicando el texto en una string, añadiéndole patrón de formato si no es el estandar
En el ejemplo, mostramos todas las posibilidades indicadas
public static void main(String[] args) {
LocalDateTime hoy = LocalDateTime.now();
Clock clock = Clock.systemDefaultZone();
LocalDateTime hoyDef = LocalDateTime.now(clock);
LocalDateTime hoyMX = LocalDateTime.now(ZoneId.of("America/Mexico_City"));
System.out.println("Hoy :" + hoy);
System.out.println("Hoy Def :" + hoyDef);
System.out.println("Hoy MX :" + hoyMX);
//---of
System.out.println("con hora :" +
LocalDateTime.of(2021, 10, 29, 10, 45));
System.out.println("con nanos :" +
LocalDateTime.of(2021, 10, 29, 10, 45, 18, 123456));
System.out.println("Julio :" +
LocalDateTime.of(2021, Month.JULY, 29, 10, 45, 18, 123456));
//-- con LocalDate y LocalTime
LocalDate uno = LocalDate.of(2020, 9, 15);
LocalTime unoT = LocalTime.of(14, 10, 0);
System.out.println("Local?? :" +
LocalDateTime.of(uno, unoT));
//ofEpoch, ofYear
System.out.println("ofEpoch :" +
LocalDateTime.ofEpochSecond(123456789L, 98765, ZoneOffset.UTC));
// parse
DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd MMMM yyyy HH:mm");
System.out.println("dParse :" +
LocalDateTime.parse("2020-08-15T07:35"));
System.out.println("dParseF :" +
LocalDateTime.parse("12 febrero 2020 17:50", formato));
// from
System.out.println("dFrom :" +
LocalDateTime.from(ZonedDateTime.now()));
}
Si lo ejecutamos, obtenemos
with(), withDayOfMonth(), withDayOfYear(), withMonth(), withYear(), withHour(), withMinute(), withNano(), withSecond(),truncateTo()
LocalDateTime with(TemporalAdjuster adjuster)
LocalDateTime with(TemporalField field, long newValue)
LocalDateTime withDayOfMonth(int dayOfMonth)
LocalDateTime withDayOfYear(int dayOfYear)
LocalDateTime withHour(int hour)
LocalDateTime withMinute(int minute)
LocalDateTime withMonth(int month)
LocalDateTime withNano(int nanoOfSecond)
LocalDateTime withSecond(int second)
LocalDateTime withYear(int year)
Obtiene un nuevo objeto LocalDateTime, tras modificar el LocalDateTime que se pasa, en la unidad indicada por el método, y con el valor aportado por el parámetro.
LocalDateTime truncatedTo(TemporalUnit unit)
Nos permite obtener un nuevo objeto LocalDateTime, a partir de uno ya existente, redondeando al nivel que nos interese, dejando las unidades inferiores a 0
En el ejemplo, podemos ver algunos usos
public static void main(String[] args) {
LocalDateTime hoy = LocalDateTime.now();
System.out.println("Hoy :" + hoy);
LocalDateTime d10 = hoy.with(ChronoField.DAY_OF_MONTH,10);
System.out.println("d10 :" + d10);
LocalDateTime dlm = hoy.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("dlm :" + dlm);
LocalDateTime d20 = hoy.withDayOfMonth(20);
System.out.println("d20 :" + d20);
LocalDateTime dAny = hoy.withDayOfYear(364);
System.out.println("dAny :" + dAny);
LocalDateTime cambioMes = hoy.withMonth(8);
System.out.println("cambioMes :" + cambioMes);
LocalDateTime cambioAny = hoy.withYear(2034);
System.out.println("cambioAny :" + cambioAny);
LocalDateTime cambioHora = hoy.withHour(15);
System.out.println("cambioHora :" + cambioHora);
LocalDateTime truncadoMinutos = hoy.truncatedTo(ChronoUnit.MINUTES);
System.out.println("truncadoMinutos :" + truncadoMinutos);
}
Que nos ofrecerá salidas como
plus(), plusDays(), plusHours(), plusMinutes(), plusSeconds(), plusNanos(), plusMonths(), plusWeeks(), plusYears()
LocalDateTime plus(long amountToAdd, TemporalUnit unit)
LocalDateTime plus(TemporalAmount amountToAdd)
LocalDateTime plusDays(long days)
LocalDateTime plusHours(long hours)
LocalDateTime plusMinutes(long minutes)
LocalDateTime plusMonths(long months)
LocalDateTime plusNanos(long nanos)
LocalDateTime plusSeconds(long seconds)
LocalDateTime plusWeeks(long weeks)
LocalDateTime plusYears(long years)
Crea un nuevo objeto LocalDateTime a partir del objeto pasado, tras sumar la cantidad, en las unidades indicadas por el método.
En el ejemplo vemos como podemos obtener una fecha sumando una cantidad de unidades a otra. Esa cantidad de unidades adquieren valor en función del método utilizado
public static void main(String[] args) {
LocalDateTime date = LocalDateTime.of(2018, Month.DECEMBER, 25,20,37);
date = date.plusDays(2); // sumo dos dias
System.out.println(date); // 2018-12-27T20:37
date = date.plusWeeks(1); // sumo 1 semana a 2018-12-27T20:37
System.out.println(date); // presenta 2019-01-03T20:37
date = date.plusMonths(28); // sumo 28 meses
System.out.println(date); // presenta 2021-05-03T20:37
date = date.plusYears(1); // suma un año
System.out.println(date); // 2022-05-03T20:37
date = date.plusHours(5); // sum0 5 horas
System.out.println(date); // 2022-05-04T01:37
}
Conseguiremos ver en salida
minus(), minusDays(), minusHours(), minusMinutes(), minusSeconds(), minusNanos(), minusMonths(), minusWeeks(), minusYears()
LocalDateTime minus(long amountToSubtract, TemporalUnit unit)
LocalDateTime minus(TemporalAmount amountToSubtract)
LocalDateTime minusDays(long days)
LocalDateTime minusHours(long hours)
LocalDateTime minusMinutes(long minutes)
LocalDateTime minusMonths(long months)
LocalDateTime minusNanos(long nanos)
LocalDateTime minusSeconds(long seconds)
LocalDateTime minusWeeks(long weeks)
LocalDateTime minusYears(long years)
Crea un nuevo objeto LocalDateTime a partir del objeto pasado, tras restar la cantidad, en las unidades indicadas por el método.
En el ejemplo vemos como podemos obtener una fecha restando una cantidad de unidades a otra. Esa cantidad de unidades adquieren valor en función del método utilizado
public static void main(String[] args) {
LocalDateTime date = LocalDateTime.of(2016, Month.FEBRUARY, 13,20,15);
date = date.minusDays(7); //resto 7 dias
System.out.println(date); // 2016-02-06T20:15
date = date.minusMonths(2); //resto 2 meses
System.out.println(date); // 2015-12-06T20:15
date = date.minus(100,ChronoUnit.DAYS); //resto 100 dias
System.out.println(date); // 2015-08-28T20:15
date = date.minusHours(2); //resto 2 horas
System.out.println(date); // 2015-08-28T18:15
}
Que nos facilita los resultados previstos
isAfter(), isBefore(), isSupported(), equals(), compareTo()
boolean isAfter(ChronoLocalDateTime<?> other)
boolean isBefore(ChronoLocalDateTime<?>other)
boolean equals(ChronoLocalDateTime<?> obj)
boolean isSupported(TemporalField field)
boolean isSupported(TemporalUnit unit)
int compareTo(ChronoLocalDateTime<?> other)
Dados dos objetos temporales, permite comparar si uno de ellos es anterior al otro o son iguales, así como comprobar si una determinada unidad temporal esta soportada por el objeto en cuestión
En el ejemplo, podemos ver el funcionamiento de estos métodos al comparar dos fechas
public static void main(String[] args) {
LocalDateTime d1 = LocalDateTime.of(2022, Month.AUGUST, 13, 10, 22);
LocalDateTime d2 = LocalDateTime.of(2022, Month.APRIL, 13, 15, 32);
System.out.println("d1 :" + d1);
System.out.println("d2 :" + d2);
System.out.println("d1.isAfter(d2 ) :" + d1.isAfter(d2));
}
Que nos respondería con
O bien, al probar si una unidad es soportada por el campo
public static void main(String[] args) {
LocalDateTime d1 = LocalDateTime.of(2022, Month.AUGUST, 13,20,25);
boolean ms = d1.isSupported(ChronoField.MILLI_OF_SECOND);
boolean dw = d1.isSupported(ChronoField.DAY_OF_WEEK);
boolean mo = d1.isSupported(ChronoUnit.MONTHS);
System.out.println("Soporta ChronoField.MILLI_OF_SECOND:"+ms);
System.out.println("Soporta ChronoField.DAY_OF_WEEK:"+dw);
System.out.println("Soporta ChronoUnit.MONTHS:"+mo);
}
Que responderá con
get(), getDayOfMonth(), getDayOfWeek(), getDayOfYear(), getHour(), getLong(), getMinute(), getSecond(), getNano(), getMonth(), getMonthValue(), getYear()
int get(TemporalField field)
int getDayOfMonth()
DayOfWeek getDayOfWeek()
int getDayOfYear()
int getHour()
long getLong(TemporalField field)
int getMinute()
int getSecond()
int getNano()
Month getMonth()
int getMonthValue()
int getYear()
Nos proporciona información acerca del contenido del campo
En el ejemplo, vemos como se puede ir obteniendo la información de un campo LocalDateTime
public static void main(String[] args) {
LocalDateTime d1 = LocalDateTime.of(2022, Month.AUGUST, 13, 10, 22);
System.out.println("Dia semana : " + d1.getDayOfWeek());
System.out.println("Dia del mes : " + d1.get(ChronoField.DAY_OF_MONTH));
System.out.println("Mes : " + d1.get(ChronoField.MONTH_OF_YEAR));
System.out.println("Hora : " + d1.get(ChronoField.HOUR_OF_DAY));
System.out.println("Mes : " + d1.getMonth());
System.out.println("Mes numero : " + d1.getMonthValue());
System.out.println("Nano : " + d1.getNano());
}
El resultado que obtendríamos es
range()
ValueRange range(TemporalField field)
Facilita el rango con que podemos filtrar cualquiera de los valores soportados, y por tanto una manera muy fácil de calcular dinámicamente filtros
En el ejemplo, vemos como calcular los filtros para distintas entradas, utilizando los ValueRange
public static void main(String[] args) {
LocalDateTime hoy = LocalDateTime.now();
System.out.println("Fecha :" +
hoy.toString());
System.out.println("Rango dias mes :" +
hoy.range(ChronoField.DAY_OF_MONTH));
System.out.println("Rango dias año :" +
hoy.range(ChronoField.DAY_OF_YEAR));
System.out.println("Rango segundos por minuto :" +
hoy.range(ChronoField.SECOND_OF_MINUTE));
System.out.println("Rango segundos por dia :" +
hoy.range(ChronoField.SECOND_OF_DAY));
}
Que nos da como resultado:
toLocalDate(), toLocalTime()
LocalDate toLocalDate()
LocalTime toLocalTime()
Conseguimos un objeto LocalDate o LocalTime con la parte correspondiente
En el ejemplo, vemos su uso
public static void main(String[] args) {
LocalDateTime hoy = LocalDateTime.now();
System.out.println("LocalDate :" +
hoy.toLocalDate());
System.out.println("LocalTime :" +
hoy.toLocalTime());
}
Que una vez impreso, aparecería como
toString()
String toString()
Nos presenta la salida en formato string, tal y como la estamos viendo en estos ejercicios.
until()
long until(Temporal endExclusive, TemporalUnit unit)
Calcula el tiempo que hay entre dos objetos LocalDateTime, en la unidad indicada
En el ejemplo, calculamos el tiempo transcurrido entre dos LocalDateTime, y lo pedimos en dias una vez, y en horas otra.
public static void main(String[] args) {
LocalDateTime d1 = LocalDateTime.of(2022, Month.AUGUST, 13,20,35);
System.out.println("d1 :" + d1);
LocalDateTime d2 = LocalDateTime.of(2024, Month.APRIL, 13,10,35);
System.out.println("d2 :" + d2);
long dias = d1.until(d2,ChronoUnit.DAYS);
System.out.println("Dias :" + dias);
long horas = d1.until(d2, ChronoUnit.HOURS);
System.out.println("Horas :" + horas);
}
Que nos ofrece, como resultado:
format()
String format(DateTimeFormatter formatter)
Formatea la fecha y hora según la forma deseada
En el ejemplo, se muestran algunos formatos. Es conveniente revisar DateTimeFormatter
public static void main(String[] args) {
LocalDateTime hoy = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
DateTimeFormatter dfu = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
String formattedDate = dtf.format(hoy);
System.out.println("LONG format : " + formattedDate);
formattedDate = hoy.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM));
System.out.println("MEDIUM format : " + formattedDate);
formattedDate = hoy.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT));
System.out.println("SHORT format : " + formattedDate);
String formateado = hoy.format(DateTimeFormatter.ofPattern("dd - MMM - yy hh:mm"));
System.out.println("Formato manual..: " + formateado);
}
Consiguiendo como resultado:
adjustInto()
Temporal adjustInto(Temporal temporal)
Obtiene un objeto temporal tras aplicarle al LocalDateTime el ajuste indicado. El objeto obtenido esta limitado por el tipo de ajuste
En el ejemplo, vemos como podemos cambiar una hora, sin modificar nada mas
public static void main(String[] args) {
LocalDateTime date = LocalDateTime.now();
System.out.println(date);
LocalTime date1 = LocalTime.parse("20:15");
date = (LocalDateTime)date1.adjustInto(date);
System.out.println(date);
}
Y vemos como resultado
atOffset(), atZone()
OffsetDateTime atOffset(ZoneOffset offset)
ZonedDateTime atZone(ZoneId zone)
Combina el objeto LocalDateTime, con una zona o un offset, para disponer de un objeto temporal completo, que pueda representar fecha y hora con indicación de zona u offset. La hora no se modifica, solo se añade la identificacion
Podemos ver un ejemplo en donde añadimos a nuestra hora local una zona, y otro, en donde añadimos el offset
public static void main(String[] args) {
LocalDateTime ahora = LocalDateTime.now();
System.out.println("ahora : " + ahora);
ZonedDateTime ahoraC = ahora.atZone(ZoneId.of("America/Mexico_City"));
System.out.println("ahoraC : " + ahoraC);
OffsetDateTime otro = ahora.atOffset(ZoneOffset.ofHours(2));
System.out.println("Offset +2 : " + otro);
}
Que nos presenta
Conclusión
La clase LocalDateTime mantiene una fecha y hora(días, mes, año, hora, minuto, segundo) y puede ser reutilizados en el resto de clases de la api java.time
Este articulo detalle una de las clases de la api java.time descritas anteriormente en el indice que se facilito sobre este tema
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.