Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Java 8 – El acceso al tiempo con LocalDate, LocalTime y LocalDateTime y (III)

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 respondera 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

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 44.220.249.141
Proxy: 44.220.249.141
Remote host: ec2-44-220-249-141.compute-1.amazonaws.com
Remote port: 53886
** 44.220.249.141, 172.70.134.48