8
votes

ISO-8601 Numérotation de la semaine VS "Outlook" Numérotation dans PHP

J'ai récemment rencontré un gros problème, car j'ai un système qui paye les clients chaque semaine.

Comme nous le savons tous, un an a 52 semaines et il y a des normes pour cela. J'utilise PHP AKA DATE ('W') pour obtenir le numéro de la semaine à partir d'une date, qui calcule en fonction de la norme ISO-8601.

Voici quelques références:

  • http://www.iso.org/iso/date_and_time_format et
  • http://fr.wikipedia.org/wiki/iso_week_date

    Mais voici le problème: année 2009 a 53 semaines. Il semble que par le biais du calendrier grégorien dans les 400 ans, il y a 71 ans qui ont 53 semaines. C'est une chose que je ne savais pas, et probablement beaucoup non plus.

    Selon Wikipedia:

    2009-12-31 est 2009-W53-4 (l'année 2009 de l'ISO compte 53 semaines, prolongeant l'année grégorienne 2009, qui commence et se termine avec jeudi, aux deux bouts avec trois jours).

    et la fonction de date dans PHP le respecte totalement.

    Si vous regardez dans Mme Outlook et montrez le jour de la semaine dans la vue du calendrier, il apparaîtra 52 semaines. Considérant le 28 décembre 2009 au 03 janvier 2010 Semaine 1. Est-ce une autre norme? La norme américaine ou quelque chose?

    Si oui, alors pourquoi php ne peut pas le supporter? Est-ce que quelqu'un a fait une fonction qui a soutenu cela?

    est-il correct d'avoir 53 semaines? Nous avons à la fois des clients européens et américains.


2 commentaires

Question interessante. Je remarque que Outlook a une semaine 53 en 2011. On dirait qu'il définit "la semaine 1" pour être la première semaine contenant le 1er janvier. Puisque les semaines peuvent commencer le dimanche ou lundi basé sur un cadre, il pourrait en réalité être différent pour différents utilisateurs.


Je viens de l'essayer. Outlook vous permettra de choisir tous les jours pour être le jour de début de la semaine et la numérotation de la semaine commence par la semaine qui contient le 1er janvier. Ainsi, il existe sept systèmes de numérotation différents disponibles dans Outlook.


5 Réponses :


4
votes

Je ne pense pas que vous ayez un problème ici. Fait est que vous suivez une norme internationale pour la mise en forme et le comptage de la date et de l'heure ( ISO8601 ). Si vous avez des clients qui se plaignent, référez-les simplement à la norme.

La numérotation de la semaine d'Outlook est un peu équivalente aux suivantes: xxx

À des fins de facturation, vous préférez utiliser ISO8601 en tant que norme. En fait, si vous regardez vos impôts que vous allez remplir cette année, ils décriront le dernier exercice comme étant de 53 semaines de long.

Le problème avec la voie de comptage Outlook est qu'une semaine n'est pas garanti d'être 7 jours. Par exemple, Ow01-2010 est compromis de seulement 2 jours: vendredi 1 janv. Jan 2, c'est une période de facturation terriblement courte pendant une semaine.

iso8601 semaines sont garantis pour Avoir 7 jours de long, c'est pourquoi nous avons besoin d'une semaine de saut tous les 4/5/6 ans.

Laquelle de ces options préféreriez-vous:

  • iso8601 : avoir 53 semaines de temps en temps, mais chacun d'entre eux est de 7 jours de long.
  • Outlook : avoir 52/53 semaines en un an au hasard, mais devoir payer deux fois par an pour une "demi-semaine".

0 commentaires

5
votes

Outlook ne suit aucun type de standard pour la numérotation de la semaine. Il a deux paramètres qui déterminent la numérotation de la semaine, appelée «premier jour de la semaine» et «première semaine de l'année».

En définissant "premier jour de la semaine" au lundi et "première semaine de l'année" à "la première semaine de 4 jours", la norme ISO peut être simulée.

Chaque utilisateur devra faire ce réglage pour suivre la norme ISO.

Je ne connais aucune norme américaine séparée et, apparemment, non plus Outlook.


0 commentaires

0
votes

Il y a plus de monde à l'extérieur des États-Unis que l'intérieur - et ISO 8601 est probablement utilisé plus largement en dehors des États-Unis qu'à l'intérieur.

L'énoncé initial «Un an a 52 semaines» n'est que partiellement vrai, comme vous l'avez maintenant trouvé. En termes de semaines ISO, vous pouvez vous retrouver avec la semaine 53, comme indiqué à Wikipedia. Vous pouvez avoir jusqu'à trois jours de l'année N + 1 dans la semaine 52 de l'année N, ou la semaine 53 de l'année N. Vous pouvez avoir jusqu'à trois jours de l'année N-1 dans la semaine 1 de l'année N, également. Et vous devez déterminer à la fois l'ISO 'Week-d'année »ainsi que la« semaine »- parce que lorsque l'année civile grégorienne est n, l'ISO Week-Année peut être l'année N-1 ou N + 1 (selon la fin de la fin de la fin de la année avec laquelle vous travaillez). C'est pourquoi il existe des spécificateurs de format séparés ("% y ',"% y ","% g ","% g ") dans StrfTime () , par exemple (mais note que la norme POSIX pense que les jours précédant le premier lundi de janvier sont la semaine 0 de l'année en cours, pas en semaine 52 ou 53 de l'année précédente).

Il ne semble pas y avoir de "norme américaine" fiable pour «semaine». Vous obtenez différents résultats en fonction du logiciel que vous utilisez. Si vous regardez le Définition de la semaine Oracle de la semaine, Ensuite, les sept premiers jours de l'année sont la semaine 1; Vous avez 1 ou 2 jours en semaine 53 à la fin de l'année.

Voir aussi SO 274861 Pour une mise en œuvre du code de numéro de semaine ISO. Même si vous ne codez pas dans la langue, l'algorithme doit être facilement compréhensible.


0 commentaires

0
votes

Juste un mot d'avertissement, si vous utilisez php, vous pouvez également utiliser MySQL. MySQL fait Non Suivez les conventions de la semaine ISO-8601, mais ferme suffisamment pour que vous puissiez penser. Au fur et à mesure que les autres personnes ont noté des perspectives, essayant d'imiter un moyen de calcul de la semaine non standard non standard ne valent pas la peine!


0 commentaires

2
votes

Voici la façon dont je l'ai résolu. Remarque: Je code en PHP, mais l'algorithme implémenté dans SQL est la partie pertinente de mon code ci-dessous. Notez également que j'ai géré "2028-12-31" séparément parce que c'est une date spéciale qui donne 54 comme numéro de semaine.

// generate an sql that calculates the outlook week of $date (until 2033)
function sqlWeek ($date) {
     $week = "if( ". $date . " = '2028-12-31', 54, (week( " . $date . ", 0) + if( (year( " . $date . ") - 1) in (2011, 2016, 2022, 2033), 0, 1)) MOD (if (year( ". $date .") = 2028, 54, if( (year( ".$date." ) - 1) in (2011, 2016, 2022, 2033), 53, 52))))";

     return "concat( if( char_length( ".$week." ) < 2, concat( '0', ".$week." ), ".$week." ), '/',  year($date) )";
} 


1 commentaires

Aussi, veuillez noter que j'ai utilisé "Semaine ('2011-11-09', 0)" Cela signifie que la semaine commence le dimanche. Si cela commence lundi, vous devriez utiliser "Semaine ('2011-11-09', 1)".