Joda Time: primer día de la semana?

¿Cómo se obtiene el primer día de la semana con un Locale usando Joda-Time ?

Punto: la mayoría de los países usan el estándar internacional el lunes como primer día de la semana (!). Un grupo de otros usan el domingo (especialmente EE. UU.). Otros al parecer el sábado. Al parecer, el miércoles?

Wikipedia “semana de siete días” #número_de semana

No hay ninguna razón por la cual no pueda usar el JDK al menos para encontrar el “inicio habitual de la semana” para la configuración regional dada. La única parte difícil es traducir constantes para los días de la semana, donde ambos son del 1 al 7, pero java.util.Calendar se desplaza en uno, con Calendar.MONDAY = 2 vs. DateTimeConstants.MONDAY = 1.

De todos modos, use esta función:

 /** * Gets the first day of the week, in the default locale. * * @return a value in the range of {@link DateTimeConstants#MONDAY} to * {@link DateTimeConstants#SUNDAY}. */ private static final int getFirstDayOfWeek() { return ((Calendar.getInstance().getFirstDayOfWeek() + 5) % 7) + 1; } 

Agregue una configuración regional a Calendar.getInstance () para obtener un resultado para una configuración regional distinta de la predeterminada.

Así es como uno podría trabajar alrededor del tiempo de Joda para llegar a los EE. UU. El primer día de la semana:

 DateTime getFirstDayOfWeek(DateTime other) { if(other.dayOfWeek.get == 7) return other; else return other.minusWeeks(1).withDayOfWeek(7); } 

O en Scala

 def getFirstDayOfWeek(other: DateTime) = other.dayOfWeek.get match { case 7 => other case _ => other.minusWeeks(1).withDayOfWeek(7) } 

Parece que no tiene suerte, parece que todas las cronologías proporcionadas heredan la implementación de baseChronology, que solo admite definiciones ISO, es decir, lunes = 1 … Domingo = 7.

Tendría que definir su propio LocaleChronology, posiblemente modelado en StrictChronology o LenientChronology, agregue un método de fábrica:

 public static LocaleChronology getInstance(Chronology base, Locale locale) 

y anular la implementación de

 public final DateTimeField dayOfWeek() 

con una reimplementación de java.util.Calendar.setWeekCountData (Locale desiredLocale) que se basa en sun.util.resources.LocaleData..getCalendarData (desiredLocale).

¿Entonces su pregunta es cómo obtener DayOfWeek de un objeto Joda DateTime? ¿Qué tal esto?

 DateTime dt = new DateTime().withYear(2009).plusDays(111); dt.toGregorianCalendar().getFirstDayOfWeek(); 

Utilicé el siguiente apéndice en Scala para obtener el primer y el último día de la semana de Joda DateTime

 val today: DateTime = new DateTime() val dayOfWeek: DateTime.Property = today.dayOfWeek() val firstDayOfWeek: DateTime = dayOfWeek.withMinimumValue().minusDays(1) val lastDayOfWeek: DateTime = dayOfWeek.withMaximumValue().minusDays(1) 

Nota : minusDays(1) solo está destinado a hacer que la semana abarque desde el domingo hasta el sábado (en lugar del valor predeterminado de lunes a domingo que Joda conoce). Para configuraciones regionales de EE. UU. (Y otras similares), puede ignorar esta parte