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

LocalDate

LocalDate es un objeto de tiempo, inmutable, que guarda la fecha como una etapa de Año-mes-día. Es uno de los objetos que podemos proponer para cambiar por Date o Calendar, debido a los métodos que posee.
Se ha de remarcar que no se puede considerar que pueda representar tiempo, porque no contiene ni el desplazamiento, ni la zona a que pertenece la fecha, sin embargo ya es útil para establecer la fecha actual, o trabajar con cumpleaños.

now(), of(), ofEpochDay(), ofYearDay(), parse(),from()

static LocalDate	now()
static LocalDate	now(Clock clock)
static LocalDate	now(ZoneId zone)
static LocalDate	of(int year, int month, int dayOfMonth)
static LocalDate	of(int year, Month month, int dayOfMonth)
static LocalDate	ofEpochDay(long epochDay)
static LocalDate	ofYearDay(int year, int dayOfYear)
static LocalDate	parse(CharSequence text)
static LocalDate	parse(CharSequence text, DateTimeFormatter formatter)
static LocalDate	from(TemporalAccessor temporal)

Crea un objeto LocalDate desde diversos orígenes

  • Desde el reloj del sistema
  • Desde un reloj definido
  • Desde el reloj del sistema en la zona indicada
  • Pasandole tres enteros correspondientes a año, mes y dia
  • Pasándole año como entero, mes como literal y día como entero
  • Indicando el numero de días transcurridos desde 1/1/1970
  • Pasandole el año, y el dia del año
  • Indicando el texto en una string, añadiéndole patrón de formato si no es el estandar
  • Desde otro campo temporal que contenga la información necesaria (día, mes, año)

En el ejemplo, mostramos todas las posibilidades indicadas

public static void main(String[] args) {
		
		LocalDate hoy = LocalDate.now();
		
		Clock clock = Clock.systemDefaultZone();		
		LocalDate hoyDef = LocalDate.now(clock);		
		LocalDate hoyMX = LocalDate.now(ZoneId.of("America/Mexico_City"));
		
		System.out.println("Hoy        :" + hoy);
		System.out.println("Hoy Def    :" + hoyDef);
		System.out.println("Hoy MX     :" + hoyMX);
//---of		
		LocalDate unDia = LocalDate.of(2021, 10,29);
		LocalDate otroDia = LocalDate.of(2022, Month.FEBRUARY ,28);
		
		System.out.println("unDia      :" + unDia);
		System.out.println("otroDia    :" + otroDia);
//ofEpoch, ofYear		
		LocalDate desdeEpoch = LocalDate.ofEpochDay(20);
		LocalDate desdeYear  = LocalDate.ofYearDay(2022,360);
		
		System.out.println("desdeEpoch :" + desdeEpoch);
		System.out.println("desdeYear  :" + desdeYear);
// parse		
		LocalDate dParse = LocalDate.parse("2020-08-15");
		
		DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd MMMM yyyy");
        LocalDate dParseF = LocalDate.parse("12 febrero 2020", formato);
        
        System.out.println("dParse     :" + dParse);
		System.out.println("dParseF    :" + dParseF);		
// from		
		LocalDateTime ahora = LocalDateTime.now();
		LocalDate pFrom = LocalDate.from(ahora);
		System.out.println("dFrom      :" + pFrom);	
	}

Dando como resultado

with(), withDayOfMonth(), withDayOfYear(), withMonth(), withYear()

LocalDate	with(TemporalAdjuster adjuster)
LocalDate	with(TemporalField field, long newValue)
LocalDate	withDayOfMonth(int dayOfMonth)
LocalDate	withDayOfYear(int dayOfYear)
LocalDate	withMonth(int month)
LocalDate	withYear(int year)

Crea un objeto LocalDate desde otro objeto LocalDate existente, modificando el dato que se le indica al seleccionar el método

En el ejemplo que continua, podemos ver como nos basta una sola linea para cambiar la fecha. en la parte que nos interese(Dia, mes o año), dejando el resto de valores igual

public static void main(String[] args) {
		
		LocalDate hoy = LocalDate.now();		
		System.out.println("Hoy        :" + hoy);
			
		LocalDate d10 = hoy.with(ChronoField.DAY_OF_MONTH,10);
		System.out.println("d10        :" + d10);
		
		LocalDate dlm = hoy.with(TemporalAdjusters.lastDayOfMonth());
		System.out.println("dlm        :" + dlm);
		
		LocalDate d20 = hoy.withDayOfMonth(20);
		System.out.println("d20        :" + d20);
		
		LocalDate dAny = hoy.withDayOfYear(364);
		System.out.println("dAny       :" + dAny);
		
		LocalDate cambioMes = hoy.withMonth(8);
		System.out.println("cambioMes  :" + cambioMes);
  
		LocalDate cambioAny = hoy.withYear(2034);
		System.out.println("cambioAny  :" + cambioAny);
	}

Los resultados obtenidos son los siguientes

plus(), plusDays(), plusMonths(), plusWeeks(), plusYears()

LocalDate	plus(long amountToAdd, TemporalUnit unit)
LocalDate	plus(TemporalAmount amountToAdd)
LocalDate	plusDays(long daysToAdd)
LocalDate	plusMonths(long monthsToAdd)
LocalDate	plusWeeks(long weeksToAdd)
LocalDate	plusYears(long yearsToAdd)

Crea un objeto LocalDate a partir de otro objeto LocalDate y sumándole el dato según el método asociado

En el ejemplo vemos como podemos sumar dias, meses o años a una fecha de forma simple

public static void main(String[] args) {
		
		LocalDate date = LocalDate.of(2018, Month.DECEMBER, 25);
		date = date.plusDays(2); // sumo dos dias
		System.out.println(date); // presenta 2018-12-27

		date = date.plusWeeks(1); // sumo 1 semana a 2018-12-27
		System.out.println(date); // presenta 2019-01-03

		date = date.plusMonths(1);
		System.out.println(date); // presenta la misma fecha un mes despues

		date = date.plusYears(1); // duma un año
		System.out.println(date); // 2020-02-03

	}

Y los resultados son los previstos

minus(), minusDays(), minusMonths(), minusWeeks(), minusYears()

LocalDate	minus(long amountToSubtract, TemporalUnit unit)
LocalDate	minus(TemporalAmount amountToSubtract)
LocalDate	minusDays(long daysToSubtract)
LocalDate	minusMonths(long monthsToSubtract)
LocalDate	minusWeeks(long weeksToSubtract)
LocalDate	minusYears(long yearsToSubtract)

Crea un objeto LocalDate a partir de otro objeto LocalDate y restándole el dato según el método asociado

En el ejemplo, vemos como podemos restar a una fecha, el tiempo que queramos

public static void main(String[] args) {
		
		LocalDate date = LocalDate.of(2016, Month.FEBRUARY, 13);
		date = date.minusDays(7); //resto 7 dias
		System.out.println(date); // 2016-02-06
		
		date = date.minusMonths(2); //resto 2 meses
		System.out.println(date); // 2015-12-06

		date = date.minus(100,ChronoUnit.DAYS); //resto 100 dias
		System.out.println(date); // 2015-08-28
	}

isAfter(), isBefore(), isEqual(), isLeapYear(), isSupported(), equals(), compareTo()

boolean	isAfter(ChronoLocalDate other)
boolean	isBefore(ChronoLocalDate other)
boolean	isEqual(ChronoLocalDate other)
boolean	equals(Object obj)
int	compareTo(ChronoLocalDate other)

Podemos comparar el LocalDate con otros, para determinar si es la misma fecha, si es anterior o si es posterior

Por ejemplo, comprobamos si una fecha es posterior a otra

public static void main(String[] args) {
		
		LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
		LocalDate d2 = LocalDate.of(2022, Month.APRIL, 13);
		
		System.out.println("d1               :" + d1);
		System.out.println("d2               :" + d2);
		System.out.println("d1.isAfter(d2 )  :" + d1.isAfter(d2));
	

	}

y dara:

boolean isLeapYear()

Nos indica si la fecha esta dentro de un año bisiesto, por ejemplo:

public static void main(String[] args) {
		
		LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
		System.out.println("d1               :" + d1);
		System.out.println("d1 es bisiesto?  :" + d1.isLeapYear());
		
		LocalDate d2 = LocalDate.of(2024, Month.APRIL, 13);
		System.out.println("d2               :" + d2);
		System.out.println("d2 es bisiesto?  :" + d2.isLeapYear());
	

	}

nos da:

boolean	isSupported(TemporalField field)
boolean	isSupported(TemporalUnit unit)

Nos indica si la unidad o el tipo de campo esta soportado en el LocalDate

public static void main(String[] args) {
		
		LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
		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);
	

	}

nos responde

get(), getChronology(), getDayOfMonth(), getDayOfWeek(), getDayOfYear(), getEra(), getLong(), getMonth(), getMonthValue(), getYear()

int	getDayOfMonth()
int	getMonthValue()
int	getYear()
int	getDayOfYear()

Facilitan el día, numero de mes ,año de la fecha y el día del año, todo a campos de tipo «int»

DayOfWeek	getDayOfWeek()
Month	        getMonth()

Entregan las enumeraciones correspondientes.

int	get(TemporalField field)
long	getLong(TemporalField field)

Facilita en int o long la información solicitada

Era	        getEra()
IsoChronology	getChronology()

Facilita el objeto Era y el Cronology (tipo de calendario)

En el ejemplo que continua, vemos como emplear estas funciones en una fecha concreta

public static void main(String[] args) {
		LocalDate hoy = LocalDate.now();
		
		System.out.println("Fecha           :" + 
				hoy.toString());
		System.out.println("Dia mes         :" + 
				hoy.getDayOfMonth());	
		System.out.println("Numero mes      :" + 
				hoy.getMonthValue());	
		System.out.println("Año             :" + 
				hoy.getYear());
		System.out.println("Dia Año         :" + 
				hoy.getDayOfYear());

		System.out.println("Dia semana Obj  :" + 
				hoy.getDayOfWeek());	
		System.out.println("Mes        Obj  :" + 
				hoy.getMonth());
		
		System.out.println("----------------------------------------");
		System.out.println("Dia   cualquiera int  :" + 
				hoy.get(ChronoField.DAY_OF_MONTH));
		System.out.println("ERA   cualquiera Long :" + 
				hoy.getLong(ChronoField.ERA));
		System.out.println("EPOCH cualquiera Long :" + 
				hoy.getLong(ChronoField.EPOCH_DAY));
		System.out.println("----------------------------------------");
		System.out.println("Era                   :" + 
				hoy.getEra());		
		System.out.println("Calendario            :" + 
				hoy.getChronology());

	}

Que generara una salida como:

lengthOfMonth(), lengthOfYear()

int	lengthOfMonth()
int	lengthOfYear()

Nos facilita el numero de días que tiene el mes o el año de la fecha

public static void main(String[] args) {
		LocalDate hoy = LocalDate.now();
		
		System.out.println("Fecha           :" + 
				hoy.toString());
		
		System.out.println("Longitud mes          :" + 
				hoy.lengthOfMonth());
		System.out.println("Longitud año          :" + 
				hoy.lengthOfYear());	
		

	}

Las instrucción nos facilitaran los días de duración del mes que se encuentre en el LocalDate, y de dicho año. en nuestro caso:

range()

ValueRange	range(TemporalField field)

Facilita el rango con que podemos filtrar cualquiera de los valores soportados

public static void main(String[] args) {
		LocalDate hoy = LocalDate.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));	
		

	}

Nos facilita el rango de días para el mes actual, y para el año actual

toEpochDay(), toString()

long	toEpochDay()
String	toString()

Convierte la fecha en numero de dias transcurridos desde 1/1/1970, o la facilita en formato string como 2022-11-13

public static void main(String[] args) {
		LocalDate hoy = LocalDate.now();
		
		System.out.println("Fecha           :" + 
				hoy.toString());
		
		System.out.println("to epoch        :" + 
				hoy.toEpochDay());		

	}

Presenta en consola

until()

Period	until(ChronoLocalDate endDateExclusive)

Obtiene la distancia, en Period, que hay entre dos fechas

long	until(Temporal endExclusive, TemporalUnit unit)

Obtiene la distancia que hay entre dos fechas, en las unidades indicadas

En el ejemplo, obtenemos la distancia en Periodo y en numero de dias

public static void main(String[] args) {
		
		LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
		System.out.println("d1               :" + d1);
		
		LocalDate d2 = LocalDate.of(2024, Month.APRIL, 13);
		System.out.println("d2               :" + d2);
		
		Period p = d1.until(d2);
		System.out.println("Period           :" + p);
		
		long dias = d1.until(d2, ChronoUnit.DAYS);
		System.out.println("Period           :" + dias);

	}

Que nos presentará

format()

String	format(DateTimeFormatter formatter)

Formatea la fecha según la forma deseada

En el ejemplo, se muestran algunos formatos. Es conveniente revisar DateTimeFormatter

public static void main(String[] args) {
		
	LocalDate hoy = LocalDate.now();

	String formattedDate = hoy.format(DateTimeFormatter
	    .ofLocalizedDate(FormatStyle.LONG));
	System.out.println("LONG format     : " + formattedDate);

	formattedDate = hoy.format(DateTimeFormatter
	    .ofLocalizedDate(FormatStyle.MEDIUM));
	System.out.println("MEDIUM format   : " + formattedDate);

	formattedDate = hoy.format(DateTimeFormatter
		    .ofLocalizedDate(FormatStyle.SHORT));
	System.out.println("SHORT format    : " + formattedDate);

	formattedDate = hoy.format(DateTimeFormatter
		    .ofLocalizedDate(FormatStyle.FULL));
	System.out.println("FULL format     : " + formattedDate);
		
	String formateado = hoy.format(DateTimeFormatter.ofPattern("dd - MMM - yy"));

	System.out.println("Formato manual..: " + formateado);
			
	}

No presenta

adjustInto()

Temporal	adjustInto(Temporal temporal)

Obtiene un objeto temporal tras aplicarle al LocalDate el ajuste indicado. El objeto obtenido esta limitado por el tipo de ajuste

En el ejemplo, vemos como podemos cambiar una fecha, sin modificar la hora ni la zona

public static void main(String[] args) {
		
		ZonedDateTime date = ZonedDateTime.now();
	      System.out.println(date);  

	      LocalDate date1 = LocalDate.parse("2017-02-03");
	      date = (ZonedDateTime)date1.adjustInto(date);
	      System.out.println(date);  

	}

Nos presenta

atStartOfDay(), atTime()

LocalDateTime	atStartOfDay()
ZonedDateTime	atStartOfDay(ZoneId zone)
LocalDateTime	atTime(int hour, int minute)
LocalDateTime	atTime(int hour, int minute, int second)
LocalDateTime	atTime(int hour, int minute, int second, int nanoOfSecond)
LocalDateTime	atTime(LocalTime time)
OffsetDateTime	atTime(OffsetTime time)

Combina el LocalDate con los valores facilitados para obtener un objeto temporal de fecha y hora

En el ejemplo, obtenemos un LocalDateTime con la hora de inicio de dia (00:00) y luego otro con las 14:20

public static void main(String[] args) {
		  LocalDate hoy = LocalDate.now();
		  System.out.println("hoy                : " + hoy); 
	      LocalDateTime ahora = hoy.atStartOfDay();
	      System.out.println("at StartOfDay      : " + ahora); 
	      
	      LocalDateTime despues = hoy.atTime(14,20);
	      System.out.println("at 14:20           : " + despues);  


	}

y su resultado

Conclusión

La clase LocalDate, mantiene una fecha (dia, mes y año) 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: 3.17.128.129
Proxy: 3.17.128.129
Remote host: ec2-3-17-128-129.us-east-2.compute.amazonaws.com
Remote port: 52336
** 3.17.128.129, 172.70.131.191