Algunas personas reales no saben en qué día, mes o incluso año nacieron.
Esto puede plantear un problema para los sistemas que requieren una fecha de nacimiento completa.
En los Países Bajos se tomó la decisión de codificar estas fechas de nacimiento con incógnitas . La siguiente es la fecha de nacimiento de alguien nacido en 1975, fecha exacta desconocida:
00-00-1975¿Cómo puedo manejar esto en Java? No estoy preguntando sobre el análisis de una cadena de "00-00-1975", sino una implementación de fecha real que admite valores desconocidos (¿quizás nulos?).
Afortunadamente, los tomadores de decisiones se dieron cuenta en 2014, y ahora las personas con una fecha de nacimiento desconocida reciben una fecha inventada. https://www.binnenlandsbestuur.nl/bestuur-en-organisatie/nieuws/niet-bestaande-geboortedatum-00-00-jj-blijft.9484714.lynkx
No, nada de eso. Puede implementar el suyo propio, por ejemplo
interface Birthday { Optional<LocalDate> fullDate(); Year year(); } class UnknownBirthday implements Birthday { private final Year year; // ctor @Override public Year year() { return year; } @Override public Optional<LocalDate> fullDate() { return Optional.empty(); } } class KnownBirthday implements Birthday { private final LocalDate date; // ctor @Override public Optional<LocalDate> fullDate() { return Optional.of(date); } @Override public Year year() { return Year.of(date.getYear()); } }Una opción es explotar la interfaz TemporalAccessor . Casi todas las clases de fecha y hora de java.time implementan esta interfaz y ciertamente aquellas clases que usaría para sus cumpleaños inciertos. Declare una variable como TemporalAccessor y puede asignarle un Year o una LocalDate o algún otro tipo.
Algunos programadores se verían tentados a usar una instanceof de mucho con una variable de este tipo, lo que puede considerarse no tan agradable. Afortunadamente para muchos propósitos tampoco es necesario. El método isSupported de TemporalAccessor se puede usar en la mayoría de las situaciones.
Para una demostración:
// Example birthdays ordered from the best known to the completely unknown TemporalAccessor[] birthdays = { LocalDate.of(1955, Month.MARCH, 22), YearMonth.of(1978, Month.MAY), Year.of(1969), IsoEra.CE }; for (TemporalAccessor birthday : birthdays) { String yearString = birthday.isSupported(ChronoField.YEAR) ? String.valueOf(birthday.get(ChronoField.YEAR)) : "N/A"; String monthString = birthday.isSupported(ChronoField.MONTH_OF_YEAR) ? Month.from(birthday).toString() : "N/A"; String dateString = birthday.isSupported(ChronoField.DAY_OF_MONTH) ? String.valueOf(birthday.get(ChronoField.DAY_OF_MONTH)) : "N/A"; System.out.format("%-10s %4s %-9s %3s%n", birthday, yearString, monthString, dateString); }La salida de este fragmento es:
1955-03-22 1955 MARCH 22 1978-05 1978 MAY N/A 1969 1969 N/AN/A CE N/AN/AN/A
Para una interfaz más agradable, puede envolver TemporalAccessor en una clase casera. Su clase podría tener captadores para Year y LocalDate , por ejemplo, que podrían devolver un Optional vacío o null en los casos en que no haya suficientes datos. Puedes pensar en métodos más convenientes. Usted conoce mejor sus requisitos, por lo que dejo los detalles del diseño para usted.
La biblioteca Joda Time tiene una clase Partial que se puede usar para crear fechas con un mes/día desconocido, etc.
Parcial es una fecha y hora parcial inmutable que admite cualquier conjunto de campos de fecha y hora.
Una instancia parcial se puede utilizar para contener cualquier combinación de campos. La instancia no contiene una zona horaria, por lo que cualquier fecha y hora es local.
Partial date = new Partial(); // prints 1975 System.out.println( date.with(year(), 1975) ); // prints 1975-03 System.out.println( date.with(monthOfYear(), 3).with(year(), 1975)); // prints 1975-03-28 System.out.println( date.with(dayOfMonth(), 28).with(monthOfYear(), 3).with(year(), 1975));