web-dev-qa-db-fra.com

Joda Time: premier jour de la semaine?

Comment obtenez-vous le premier jour de la semaine donné Locale en utilisant Joda-Time ?

Point: La plupart des pays utilisent la norme internationale lundi comme premier jour de la semaine (!). Beaucoup d'autres utilisent le dimanche (notamment aux États-Unis). D'autres apparemment samedi. Certains apparemment mercredi?!

Wikipedia "Semaine de sept jours" #Week_number

56
stolsvik

Joda-Time utilise la norme ISO du lundi au dimanche semaine.

Il n'a pas la possibilité d'obtenir le premier jour de la semaine, ni de renvoyer l'indice du jour de la semaine en fonction d'un jour autre que le lundi standard. Enfin, les semaines sont toujours calculées par rapport aux règles ISO.

44
JodaStephen

Il n'y a aucune raison pour laquelle vous ne pouvez pas utiliser le JDK au moins pour trouver le "début habituel de la semaine" pour les paramètres régionaux donnés. La seule partie délicate consiste à traduire des constantes pour les jours de la semaine, où les deux vont de 1 à 7, mais Java.util.Calendar est décalé d'une unité, avec Calendar.MONDAY = 2 contre DateTimeConstants.MONDAY = 1.

Quoi qu'il en soit, utilisez cette fonction:

/**
 * 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;
}

Ajoutez un paramètre régional à Calendar.getInstance () pour obtenir un résultat pour certains paramètres régionaux autres que ceux par défaut.

14
Mark Renouf

Voici comment contourner Joda pour obtenir le premier jour de la semaine aux États-Unis:

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

Ou à Scala

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

Il semble que vous n'ayez pas de chance, il semble que toutes les chronologies fournies héritent de l'implémentation de baseChronology, qui ne prend en charge que les définitions ISO, c'est-à-dire lundi = 1 ... dimanche = 7.

Vous devrez définir votre propre LocaleChronology, éventuellement sur le modèle de StrictChronology ou LenientChronology, ajouter une méthode d'usine:

public static LocaleChronology getInstance(Chronology base, Locale locale)

et remplacer la mise en œuvre de

public final DateTimeField dayOfWeek()

avec une réimplémentation de Java.util.Calendar.setWeekCountData (Locale desireLocale) qui s'appuie sur Sun.util.resources.LocaleData..getCalendarData (desireLocale).

2
crowne