57 votes

Début de la semaine pour une locale utilisant Joda-Time

Comment déterminer quel jour de la semaine est considéré comme le "début" selon une donnée Locale en utilisant Joda-Time ?

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

Wikipedia "Semaine de sept jours "#Numéro de la semaine

1 votes

Relisez ma question, s'il vous plaît. Je crois que j'ai suffisamment insisté sur ce point pour qu'il soit impossible de le confondre avec la question que vous avez formulée tous les deux. Étonnamment, je me suis trompé. Je recommence : Certaines régions (par exemple les États-Unis) utilisent le dimanche comme premier jour de la semaine. D'autres utilisent le lundi, standard ISO, comme premier jour de la semaine. Comment puis-je interroger Joda Time à ce sujet ? Avec Java, c'est très facile : [java.sun.com/javase/6/docs/api/java/util/](http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#getFirstDayOfWeek()) Donc : Calendar.getInstance(Locale.US).getFirstDayOfWeek(). Avec Joda ?

2 votes

Pourquoi ne pas simplement utiliser Calendar.getInstance(Locale.US).getFirstDayOfWeek() ?

3 votes

Parce que si je veux utiliser Joda Time, je veux l'utiliser "de bout en bout", et non pas mélanger deux bibliothèques complètement différentes.

46voto

JodaStephen Points 6357

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

Il n'a pas la capacité d'obtenir le premier jour de la semaine, ni de renvoyer l'indice du jour de la semaine basé sur un jour autre que le lundi standard. Enfin, les semaines sont toujours calculées selon les règles ISO.

23 votes

Alors je dois demander : ne faut-il pas y voir une carence manifeste de Joda Time ? Sérieusement, pour les "calendriers imprimés" (c'est-à-dire ceux que l'on accroche à sa cuisine, ceux que l'on choisit dans les applications web de planification des vols), je trouve très ennuyeux qu'un calendrier indique le dimanche comme premier jour de la semaine - j'ai effectivement des problèmes à cause de cela. Je suppose donc que c'est exactement la même chose pour les Américains lorsqu'on leur présente des calendriers où les semaines commencent le lundi : Tout devient "un jour en avance", pour ainsi dire - lorsqu'il regarde la troisième "case" d'une semaine, un Américain suppose que c'est mardi.

1 votes

@stolsvik Pourquoi devrait-il s'agir d'une carence ? Cela détermine seulement quel numéro correspond à quel jour de la semaine. Ex : 1=MONDI.

11 votes

Parce que, @CristianVrabie, cela rend le travail avec la bibliothèque plus difficile si vous devez trouver le premier jour de la semaine pour une date donnée. Pour les localités avec le lundi, vous pouvez simplement invoquer LocalDate.now().withDayOfWeek(DateTimeConstants.MONDAY) mais cela ne fonctionnera pas si vous avez besoin d'un dimanche à la place. Vous devez vérifier si c'est déjà dimanche, et si ce n'est pas le cas, aller à dimanche et une semaine en arrière. C'est nul. Cependant, notez que le calendrier de Java est également nul ; pire encore, il vous laisse croire qu'il fonctionne alors que ce n'est pas le cas, cf. stackoverflow.com/a/7499264/505775

15voto

Mark Renouf Points 13128

Il n'y a aucune raison pour que vous ne puissiez pas utiliser le JDK au moins pour trouver le "début coutumier de la semaine" pour le Locale donné. La seule partie délicate est la traduction des constantes pour les jours de la semaine, où les deux sont de 1 à 7, mais java.util.Calendar est décalé d'un, 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 une Locale à Calendar.getInstance() pour obtenir un résultat pour une Locale autre que celle par défaut.

0 votes

C'est ce que j'ai écrit dans un commentaire à la question 29. nov. 2009.

1 votes

Très bonne réponse qui fournit au PO ce qu'il dit rechercher. Une suggestion : spécifiez explicitement le nom du paquetage, "java.util.Calendar", afin qu'un puriste n'ait pas besoin de voir ses sensibilités violées par une déclaration d'utilisation indésirable en haut de son code :-)

7voto

Cory Klein Points 5117

Voici comment on peut contourner l'heure de 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 en Scala

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

2voto

crowne Points 6002

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 supporte que les définitions ISO, c'est à dire Lundi=1 ... Dimanche=7.

Vous devriez définir votre propre LocaleChronology, éventuellement modelée sur StrictChronology ou LenientChronology, et ajouter une méthode d'usine :

public static LocaleChronology getInstance(Chronology base, Locale locale)

et remplacer l'implémentation de

public final DateTimeField dayOfWeek()

avec une réimplémentation de java.util.Calendar.setWeekCountData(Locale desiredLocale) qui repose sur sun.util.resources.LocaleData..getCalendarData(desiredLocale).

0 votes

Je ne comprends pas bien. Les Norvégiens et les Américains sont d'accord pour dire que le 2009-11-26 est un jeudi - c'est seulement que lorsque nous affichons une semaine complète - 7 jours d'affilée - nous, les Européens, commençons par un lundi et finissons par le dimanche suivant (le "week-end" étant le samedi et le dimanche, n'est-ce pas ? C'est exactement la même chose que les Norvégiens qui écrivent 26/11 2009, les Suédois 2009-11-26 (ils sont logiques là-bas !), et les Américains 11/26 2009 ( ?!). Il s'agit simplement d'un problème d'affichage, pas d'un problème de calcul.

0 votes

Toutes les chronologies indiquent que le 2009-11-26 est un jeudi, ce qui devrait correspondre à la semaine 48 sur 53 dans la chronologie ISOC. Si nous demandions quel est le premier jour de la semaine (48), la réponse dépendrait de la région : US = dim 2009-11-22 NO = lun 2009-11-23

0 votes

Le problème semble similaire aux différents langages de programmation qui utilisent des valeurs différentes pour la première position dans un tableau, par exemple, java est basé sur zéro array[0], alors que pascal et cobol sont basés sur 1 array[1]. Ainsi, si l'on vous donne un élément aléatoire > 1 dans un tableau d'une taille de 7, la façon dont vous déterminez comment revenir à la première position dépendra de votre langage de programmation : java : fdow(day[3]) = day[3-3] cobol/pascal : fdow(day[3]) = day[3-2]

0voto

Fan Jin Points 957

C'est ce que j'ai trouvé. Le site startOfWeek sera toujours le début d'un dimanche et la endOfweek sera toujours une fin de samedi (début de lundi).

DateTime startOfWeek;
DateTime endOfWeek;
// make sure Sunday is the first day of the week, not Monday
if (dateTime.getDayOfWeek() == 7) {
    startOfWeek = dateTime.plusDays(1).weekOfWeekyear().roundFloorCopy().minusDays(1);
    endOfWeek = dateTime.plusDays(1).weekOfWeekyear().roundCeilingCopy().minusDays(1);
} else {
    startOfWeek = dateTime.weekOfWeekyear().roundFloorCopy().minusDays(1);
    endOfWeek = dateTime.weekOfWeekyear().roundCeilingCopy().minusDays(1);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X