util nueva manejo localdatetime horas fechas ejemplo conociendo java java-8 java-time

nueva - manejo de horas en java



En la clase java.time.Period, ¿cuáles son los propósitos de withDays(), withMonths(), withYears()? (2)

En java-8 new Date API, es una regla tal vez, el método se inicia con la creación de un nuevo objeto, generalmente un método estático, y el método de inicio with significa modificar algún atributo, generalmente un método de objeto.

entonces Period.ofDays(2) significa crear un Período cuyo atributo days es 2, pero withDays(2) significa modificar un Período de atributo días a un nuevo valor 2.

Ellos tienen un papel diferente.

Noté que la clase java.time.Period contiene algunos métodos de instancia que se comportan igual que los métodos de fábrica estáticos disponibles.

  • .withDays() comporta igual que Period.ofDays()
  • .withMonths() comporta de la misma manera que Period.ofMonths()
  • .withYears() comporta de la misma manera que Period.ofYears()

Estos métodos de instancia son confusos porque crean un nuevo Período y lo devuelven, pero sin tener en cuenta el estado del Período en el que se invocaron.

Period p = Period.ofWeeks(3); p = p.withDays(2);

Parece lógico que esto devuelva un período de 3 semanas, 2 días, pero devuelve solo un período de 2 días. Esto es lo mismo que si hubiera llamado Period.ofDays(2) .

Además, hay otros cinco métodos de fábrica estáticos sin métodos de instancia análogos.

Entonces, ¿hay alguna razón por la cual estos tres métodos de instancia existirían? Si es así, ¿cuál es el caso de uso?


Hizo una elección desafortunada para probar, básicamente, "semanas" no es una unidad independiente; es solo una abreviatura de 7 días. De los documentos para ofWeeks :

El período resultante se basará en el día, con la cantidad de días igual al número de semanas multiplicado por 7. Las unidades de años y meses serán cero.

Cuando llamas a withDays , eso efectivamente "sobrescribe" el número de días en el resultado, pasando de 21 días a 2 días.

Así que intente esto en su lugar:

Period p = Period.ofMonths(3); p = p.withDays(2);

Esto ahora será 3 meses y 2 días.