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

Ends in 05h 23m 49s

Java 8 – MonthDay

Este extraño objeto perteneciente al package java.time de java8 es una clase capaz de conservar dia y mes. Estos valores no se guardan con relación a año, o zona, por lo que tienen una utilidad relativa. Como todas las clases de este paquete, esta clase es inmutable y además thread-safe

now(), of(), parse(), from()

static MonthDay	now()
static MonthDay	now(Clock clock)
static MonthDay	now(ZoneId zone)
static MonthDay	of(int month, int dayOfMonth)
static MonthDay	of(Month month, int dayOfMonth)
static MonthDay	parse(CharSequence text)
static MonthDay	parse(CharSequence text, DateTimeFormatter formatter)
static MonthDay	from(TemporalAccessor temporal)

Crea un objeto MonthDay desde diversos orígenes

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

En el ejemplo, mostramos todas las posibilidades indicadas

public static void main(String[] args) {
		
	MonthDay ahora= MonthDay.now();
		
	Clock clock = Clock.systemDefaultZone();		
	MonthDay ahoraDef = MonthDay.now(clock);		
	MonthDay ahoraMX = MonthDay.now(ZoneId.of("America/Mexico_City"));
	
	System.out.println("Ahora        :" + ahora);
	System.out.println("Ahora Def    :" + ahoraDef);
	System.out.println("Ahora MX     :" + ahoraMX);
//---of		
	MonthDay unDia = MonthDay.of(11, 30);
	MonthDay otrDia = MonthDay.of(Month.JANUARY, 15 );
		
	System.out.println("unDia        :" + unDia);
	System.out.println("otrDia       :" + otrDia);
// parse		
	MonthDay dParse = MonthDay.parse("--11-21");
	
	DateTimeFormatter formato = DateTimeFormatter.ofPattern("MM dd");
        MonthDay dParseF = MonthDay.parse("12 01", formato);
        
        System.out.println("dParse       :" + dParse);
	System.out.println("dParseF      :" + dParseF);		
// from		
	LocalDateTime mas = LocalDateTime.now();
	MonthDay pFrom = MonthDay.from(mas);
	System.out.println("dFrom        :" + pFrom);	
}

Al ejecutar, veremos los resultados

with(), withDayOfMonth(), withMonth()

MonthDay	with(Month month)
MonthDay	withDayOfMonth(int dayOfMonth)
MonthDay	withMonth(int month)

Estos métodos nos permiten obtener in objeto MontDay, a partir de otro existente, pero cambiando el mes o el día

Podemos ver como trabaja en el siguiente ejemplo

public static void main(String[] args) {
		
	MonthDay hoy = MonthDay.now();		
	System.out.println("Hoy        :" + hoy);
		
	MonthDay d20 = hoy.withDayOfMonth(20);
	System.out.println("d20        :" + d20);

	MonthDay cambioMes = hoy.withMonth(8);
	System.out.println("cambioMes  :" + cambioMes);
  
	MonthDay cambioAny = hoy.with(Month.MARCH);
	System.out.println("cambioMes2 :" + cambioAny);
}

Que nos ofrece los siguientes resultados

isAfter(), isBefore(), isSupported(), isValidYear()

boolean	isAfter(MonthDay other)
boolean	isBefore(MonthDay other)
boolean	equals(Object obj)
int	compareTo(MonthDay other)

Nos permite comprobar si el mes/dia que estamos probando es anterior o posterior a otro objeto MonthDay. En este caso, no podemos utilizar el comparador igual (==)

Si utilizamos el método compareTo, debemos utilizar el 0 y los valores positivos y negativos que surjan, para saber cual es mayor, ya que los valores absolutos que nos facilita son delicados de manejar

boolean	isSupported(TemporalField field)

Nos permite comprobar si la unidad que indicamos, existe en el campo. En este caso, solo se aceptara las correspondientes a día y mes

boolean	isValidYear(int year)

Nos permite comprobar si el MonthDay indicado es correcto para el año indicado

Vemos como podemos utilizarlo en el siguiente ejemplo:

public static void main(String[] args) {
		
	MonthDay d1 = MonthDay.of( Month.AUGUST, 13);
	System.out.println("d1               :" + d1);
		
	MonthDay d2 = MonthDay.of(Month.APRIL, 13);
	System.out.println("d2               :" + d2);
		
	System.out.println("d1 es after?  :" + d1.isAfter(d2));
	System.out.println("d1 es before? :" + d1.isBefore(d2));
	System.out.println("d1 es =?      :" + d1.equals(d2));
	System.out.println("d1 compareTo  :" + d1.compareTo(d2));
		
	boolean ms = d1.isSupported(ChronoField.MILLI_OF_SECOND);
	boolean dw = d1.isSupported(ChronoField.DAY_OF_WEEK);
	boolean dm = d1.isSupported(ChronoField.DAY_OF_MONTH);
		
	System.out.println("Soporta ChronoField.MILLI_OF_SECOND:"+ms);
	System.out.println("Soporta ChronoField.DAY_OF_WEEK    :"+dw);
	System.out.println("Soporta ChronoField.DAY_OF_MONTH   :"+dm);
		
		
	System.out.println("d1 es valido para 2022             :" + d1.isValidYear(2022));
}

Veremos el resultado

get(), getDayOfMonth(), getLong(), getMonth(), getMonthValue()

int	get(TemporalField field)
int	getDayOfMonth()
long	getLong(TemporalField field)
Month	getMonth()
int	getMonthValue()

Nos permite obtener los distintos valores contenidos en el MonthDay, en distintos formatos

Vemos un ejemplo de como utilizar estos métodos sobre un único objeto MonthDay

	public static void main(String[] args) {
		MonthDay hoy = MonthDay.now();
		
		System.out.println("Fecha           :" + 
				hoy.toString());
		System.out.println("Dia mes         :" + 
				hoy.getDayOfMonth());	
		System.out.println("Numero mes      :" + 
				hoy.getMonthValue());	
		
		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("----------------------------------------");
		

	}

Con el siguiente resultado:

range()

ValueRange	range(TemporalField field)

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

El siguiente ejemplo

	public static void main(String[] args) {
		MonthDay hoy = MonthDay.now();
		
		System.out.println("Fecha           :" + 
				hoy.toString());
		
		System.out.println("Rango  dias mes        :" + 
				hoy.range(ChronoField.DAY_OF_MONTH));
		System.out.println("Rango  meses           :" + 
				hoy.range(ChronoField.MONTH_OF_YEAR));	
		
	}

Nos responde con los rangos que se pueden utilizar para mes y para día del mes

toString()

String	toString()

Somo se puede suponer nos ofrece el contenido del objeto en formato string

public static void main(String[] args) {
	MonthDay hoy = MonthDay.now();
		
	System.out.println("mes/dia          :" + 
				hoy.toString());
}

Nos presenta

format()

String	format(DateTimeFormatter formatter)

Formatea el MonthDay según la forma deseada

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

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

	String formattedDate="";	
	String formateado = hoy.format(DateTimeFormatter.ofPattern("dd - MMM "));
	System.out.println("Formato manual..: " + formateado);
			
}

No da como resultado:

adjustInto()

Temporal	adjustInto(Temporal temporal)

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

En el ejemplo, vemos como cambiamos el mes y el dia unicamente tras utilizar un objetoMonthDay con los valores deseados

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

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

}

Consigue el siguiente resultado

atYear()

LocalDate	atYear(int year)

Nos construye un objeto LocalDate, tras añadirle a un MonthDay el año que nos interese

Lo vemos a continuación

public static void main(String[] args) {
	  MonthDay hoy = MonthDay.now();
	  System.out.println("hoy           : " + hoy); 
          LocalDate ahora = hoy.atYear(2022);
	  System.out.println("con año       : " + ahora); 
}

Que nos calcula

Conclusión

La clase MonthDay, mantiene una fecha (día y mes ) 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: 100.28.227.63
Proxy: 100.28.227.63
Remote host: ec2-100-28-227-63.compute-1.amazonaws.com
Remote port: 60716
** 100.28.227.63, 172.70.175.167