ISO-8601 Wochennummerierung vs. "Outlook" Nummerierung in PHP

8

Ich bin kürzlich auf ein großes Problem gestoßen, da ich ein System habe, das die Kunden wöchentlich bezahlt.

Wie wir alle wissen, hat ein Jahr 52 Wochen und es gibt Standards dafür. Ich benutze PHP aka date ('W'), um die Wochennummer von einem Datum zu erhalten, das das nach dem Standard ISO-8601 berechnet.

Hier sind einige Referenzen:

Aber hier ist die Ausgabe: Jahr 2009 hat 53 Wochen. Es scheint, dass durch den Gregorianischen Kalender innerhalb von 400 Jahren 71 Jahre 53 Wochen haben. Das ist eine Sache, die ich nicht wusste und wahrscheinlich auch viele nicht.

Laut Wikipedia:

  

2009-12-31 ist 2009-W53-4 (ISO-Jahr 2009 hat 53 Wochen, verlängert das Gregorianische Jahr 2009, das mit Donnerstag beginnt und endet, an beiden Enden mit drei Tagen).

und die Datumsfunktion in PHP respektiert es vollständig.

Wenn Sie in MS Outlook nachsehen und den Wochentag in der Kalenderansicht anzeigen, wird er 52 Wochen lang angezeigt in Anbetracht 28 DEC 2009 zu 03 JAN 2010 Woche 1. Ist das ein anderer Standard? Der US-Standard oder so?

Wenn ja, warum kann PHP das nicht unterstützen? Hat jemand eine Funktion erstellt, die dies unterstützt?

Ist es richtig, 53 Wochen zu haben? Wir haben sowohl europäische als auch amerikanische Kunden.

    
PartySoft 04.02.2010, 18:11
quelle

5 Antworten

4

Ich glaube nicht, dass Sie hier ein Problem haben werden. Tatsache ist, dass Sie einen internationalen Standard für das Formatieren und Zählen von Datum und Uhrzeit einhalten ( ISO8601 ). Wenn Sie Kunden haben, die sich beschweren, verweisen Sie einfach auf den Standard.

Die Wochennummerierung von Outlook ist etwas , das dem folgenden entspricht:

%Vor%

Für Abrechnungszwecke verwenden Sie besser ISO8601 als Standard. In der Tat, wenn Sie Ihre Steuern betrachten, die Sie dieses Jahr füllen werden, werden sie das letzte Geschäftsjahr als 53 Wochen lang beschreiben.

Das Problem mit der Outlook-Zählweise ist, dass eine Woche nicht garantiert 7 Tage ist. Zum Beispiel, OW01-2010 ist von nur 2 Tagen kompromittiert: Fr Jan 1, Sat Jan 2. Das ist eine schrecklich kurze Abrechnungszeitraum für eine Woche.

ISO8601 Wochen sind garantiert 7 Tage lang, weshalb wir alle 4/5/6 Jahre eine Schaltwoche brauchen.

Welche dieser Optionen bevorzugen Sie?

  • ISO8601 : Ab und zu 53 Wochen, aber jeder einzelne ist 7 Tage lang.
  • Outlook : 52/53 Wochen im Jahr nach dem Zufallsprinzip, aber zweimal im Jahr für eine "halbe Woche" bezahlen.
Andrew Moore 04.02.2010, 18:21
quelle
5

Outlook folgt keinem Standard für die Wochennummerierung. Es hat zwei Einstellungen, die die Wochennummerierung festlegen, die als "Erster Tag der Woche" und "Erste Woche des Jahres" bezeichnet werden.

Wenn Sie "Erster Tag der Woche" auf Montag und "Erste Woche des Jahres" auf "Erste 4-Tage-Woche" setzen, kann der ISO-Standard simuliert werden.

Jeder Benutzer muss diese Einstellung vornehmen, um dem ISO-Standard zu folgen.

Ich kenne keinen separaten US-Standard und anscheinend auch Outlook nicht.

    
Jeffrey L Whitledge 04.02.2010 18:23
quelle
2

Hier ist die Art, wie ich es gelöst habe. Hinweis: Ich code in PHP, aber der Algorithmus in SQL implementiert ist der relevante Teil meines Codes unten. Beachten Sie auch, dass ich '2028-12-31' getrennt behandelt habe, weil es ein spezielles Datum ist, das 54 als Wochennummer angibt.

%Vor%     
Amit 09.11.2011 13:28
quelle
0

Außerhalb der USA gibt es mehr von der Welt als von innen - und ISO 8601 wird wahrscheinlich außerhalb der USA breiter verwendet als innen.

Die erste Aussage "Ein Jahr hat 52 Wochen" stimmt nur teilweise, wie Sie jetzt herausgefunden haben. In Bezug auf ISO Wochen, können Sie mit Woche 53 enden, wie in Wikipedia erwähnt. Sie können bis zu drei Tage des Jahres N + 1 in Woche 52 des Jahres N oder in Woche 53 des Jahres N haben. Sie können bis zu drei Tage des Jahres N-1 auch in Woche 1 des Jahres N haben. Und Sie müssen sowohl ISO 'Woche-Jahr' als auch 'Woche' bestimmen - denn wenn das Gregorianische Kalenderjahr N ist, kann das ISO-Wochen-Jahr das Jahr N-1 oder N + 1 sein (abhängig davon, welches Ende des Jahr, mit dem du arbeitest). Aus diesem Grund gibt es separate Formatbezeichner ('% Y', '% y', '% g', '% G') in strftime () zum Beispiel (aber beachten Sie, dass der POSIX-Standard denkt, dass sich Tage vor dem ersten Montag im Januar in Woche 0 des aktuellen Jahres befinden, nicht in Woche 52 oder 53 des vorherigen Jahres ).

Es scheint keinen zuverlässigen "US-Standard" für "Woche" zu geben. Je nach verwendeter Software ergeben sich unterschiedliche Ergebnisse. Wenn Sie sich die Oracle Definition der Woche ansehen, dann die ersten sieben Tage das Jahr sind Woche 1; Sie haben 1 oder 2 Tage in Woche 53 am Ende des Jahres.

Siehe auch SO 274861 für eine Implementierung von ISO-Wochennummerncode. Selbst wenn Sie nicht in der Sprache programmieren, sollte der Algorithmus leicht verständlich sein.

    
Jonathan Leffler 04.02.2010 18:46
quelle
0

Nur ein Wort der Warnung, wenn Sie PHP verwenden, könnten Sie auch MySQL verwenden. MySQL tut NICHT Folgen Sie den ISO-8601-Woche-Konventionen, aber schließen Sie es so weit, dass Sie vielleicht denken, dass dies der Fall ist. Wie andere Leute über Outlook bemerken, ist es nicht wert, eine wackelige, nicht standardisierte Art der Berechnung von Wochennummern nachzuahmen!

    
pr1001 04.02.2010 19:05
quelle

Tags und Links