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
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.