Pregunta

¿Cómo se obtiene el primer día de la semana con un Locale utilizando 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 que otros usan el domingo (notablemente los Estados Unidos). Otros aparentemente el sábado. ¿Aparentemente algunos miércoles ?!

Wikipedia " Siete días semana " #Week_number

¿Fue útil?

Solución

Joda-Time utiliza la norma ISO de lunes a domingo de la semana.

No tiene la capacidad de obtener el primer día de la semana, ni de devolver el índice del día de la semana en base a ningún día que no sea el lunes estándar. Finalmente, las semanas siempre se calculan según las normas ISO.

Otros consejos

No hay ninguna razón por la que no pueda utilizar el JDK al menos para encontrar el " inicio habitual de la semana " para el Locale dado. La única parte difícil es traducir constantes para los días de la semana, donde ambos son de 1 a 7, pero java.util.Calendar se desplaza en uno, con Calendar.MONDAY = 2 vs. DateTimeConstants.MONDAY = 1.

De todos modos, usa 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 alguna configuración regional distinta de la predeterminada.

Aquí se explica cómo se puede evitar el tiempo de Joda para obtener el primer día de la semana en Estados Unidos:

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 tienes 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 propia LocaleChronology, posiblemente modelada 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 deseadoLocale) que se basa en sun.util.resources.LocaleData..getCalendarData (deseadoLocale).

Entonces, tu pregunta es, ¿cómo obtener DayOfWeek de un objeto Joda DateTime? ¿Qué hay de esto:

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

Usé el siguiente stub en Scala para obtener el primer y ú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 : el minusDays (1) solo pretende hacer que el período de la semana sea de domingo a sábado (en lugar del lunes predeterminado para Domingo conocido por Joda ). Para locales (y otras similares) de EE. UU., Puede ignorar esta parte

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top