2009-01-26 7 views
7

Ich entwickle eine internationale Software, die als einfache Projektmanagement-Software fungiert, und ich stehe vor einem Problem. Dieses Problem betrifft Datum/Stunde und Zeitzone.
Wenn eine Nachricht von einer Zeitzone in eine andere Zeitzone gesendet wird, kann ich die UTC (GMT) -Zeit in meiner Datenbank speichern und sie dann entsprechend der Zeitzone des Benutzers anders anzeigen lassen. Aber das kann nicht gemacht werden, wenn ich nur mit Datum arbeite.
Wenn ich sage, eine Aufgabe ist wegen des 21. März. Sollte ich meinen, dass dieses Datum in einigen anderen Ländern 20 oder 22 Jahre betragen kann? Was sind Ihre Ratschläge zu diesem Problem?Wie gehe ich mit Datum und Uhrzeit in verschiedenen Zeitzonen um?

+0

Darf ich einen schamlosen Stecker für meine eigene (aber andere) Frage stellen, wie man das korrekte Zeitzonen-Handling testet? http://stackoverflow.com/questions/477965/testing-correct-timezone-handling –

+1

Sie müssen es amüsant finden, dass wenn Sie die Tags "Lokalisierung" oder "Internationalisierung" suchen, Sie nur zwei Fragen bekommen, aber wenn Wenn Sie nach "Lokalisierung" oder "Internationalisierung" suchen, bekommen Sie haufenweise! – Evan

Antwort

4

Angenommen, ein Benutzer in New York legt ein Fälligkeitsdatum für ein Projekt als "jederzeit Montag, 26. Januar" fest. Das heißt "jederzeit von 06.00 Uhr Montag 26. Januar bis 06.00 Uhr Dienstag 27. Januar" in Brüssel und "jederzeit von 2000 Sonntag 25. Januar bis 2000 Montag 26. Januar" in LA

So ist die Aufgabe um 2100 am Montag 26 in Brüssel in Ordnung und NY, aber zu spät in LA

Eine mögliche Arbeit ist nie nur Arbeit mit dem Datum. Wenn die Uhrzeit nicht angegeben wird, legen Sie sie entweder für 00:00 Uhr oder 24:00 Uhr an dem in der Zeitzone des Benutzers angegebenen Datum fest.

Die Benutzer müssen möglicherweise mit seltsamen fälligen Daten/Zeiten umgehen, aber als jemand zu sprechen, der früher international gearbeitet hat, geht es irgendwie mit dem Territorium.

2

Sie werden nicht in der Lage zu erreichen, was Sie versuchen, ohne die genaue Zeit zu speichern. Sie haben einfach nicht genug Informationen.

2

Wenn Sie keine Zeit haben, nehmen Sie an, dass die Uhrzeit das Geschäftsende im Hauptgebietsschema für die Anwendung ist, und übersetzen Sie diese Zeit wie zu einem anderen Zeitpunkt. Eine Alternative wäre das Ende des Geschäftstages in Ortszeit und die Anpassung an UTC. Jeder Benutzer, der die Anwendung verwendet, muss verstehen, welche Standardzeit Sie annehmen, wenn Sie die Uhrzeit nicht angeben. Die Koordinierung mit dem Hauptbüro kann in einem großen Unternehmen am besten sein, während die Koordinierung zur lokalen Zeit am besten in stark dezentralisierten Umgebungen sein kann, in denen der lokale Kontext ebenso wichtig ist.

+0

Das Ende des Tages in UTC wäre für die Person, die das Fälligkeitsdatum festlegt, kontraintuitiv (es sei denn, sie leben bereits in ZULU-Zeit). – officemonkey

+0

@officemonkey - deshalb war es nicht mein erster Vorschlag. Ich denke, es ist vielleicht besser, das Ende des Geschäftstages in Ortszeit zu wählen und das für alle anderen anzupassen. Das macht wahrscheinlich am meisten Sinn für die Person, die die Aufgabe eingibt. Ich werde die Antwort anpassen. – tvanfosson

+0

Ende des Geschäfts ist zu vage. –

1

Die einfachste Lösung wäre, nur für alle das gleiche Datum anzuzeigen. Die Frist wäre dann effektiv Mitternacht in der letzten Zeitzone.

Andernfalls entscheiden Sie, wie die Standardzeit des Termins in der Zeitzone sein soll, in der die Aufgabe erstellt wurde, z. 21. März 17:00 Uhr EST oder 22 März 00:00 Uhr EST und zeigt das in der lokalen Zeitzone an. Die Zeitzonendifferenz wird dann für den Betrachter entsprechend in den vorherigen Tag oder nächsten Tag verschoben.

0

Wenn Sie eine einzelne Instanz einer DB haben, würde ich alle Daten in der Datetime-Zeitstempel Ihres DB-Servers speichern. Wenn Sie Zeilen mit Zeitstempeln versehen, sollten Sie GetDate() in T-SQL oder als Standardwert für die Zeitstempeldatenspalte berücksichtigen. Dann haben Sie Ihren einzigen Bezugspunkt für alle Zeiten. Betrachten Sie das UTC-Format dort.

Dann werden alle Kunden den Zugriff auf das Datum tun, um ihre eigene Umwandlung in „Ortszeit“, die durch Dinge wie interpretiert werden können: Benutzereinstellungen, Datum Zeitstempel auf den Client-Computer usw.

Ohne mehr zu wissen, es schwer zu sagen, was genau die Auflösung ist.

1

SQL 2008 ermöglicht einen Date-Datentyp, dem kein Zeitwert zugeordnet ist. Das erlaubt jemandem zu sagen, dass ich dies bis zu diesem Datum machen muss, aber es ist mir egal, ob es +/- mehrere Stunden ist. Wenn das gewählte Datum 01.01.2009 ist, aber es am 1/2/2009 um 2 Uhr nachts passiert, ist es wahrscheinlich egal.

Wenn der Benutzer etwas benötigt, das zu einem bestimmten Datum und einer bestimmten Uhrzeit fertig ist, wie zum Geschäftsschluss am 1.1.2009, dann müssen Sie es in einer DateTime als UTC speichern und es in die lokale Uhrzeit clientseitig konvertieren.

Dies wird viel von der Komplexität aus der Anzeige, wenn etwas abgeschlossen ist, wird es entweder in der Nähe eines bestimmten Tages oder zu einer bestimmten Zeit abgeschlossen sein.

2

Wenn Sie die Minuten und Sekunden nicht speichern, müssen Sie davon ausgehen, dass das eingegebene Datum das gewünschte Datum und keine Anpassungen für GMT ist. Einfach in die Datenbank einfügen. Die Menschen an der Westküste müssen davon ausgehen, dass das Fälligkeitsdatum gleich ist, egal wo auf der Welt Sie sich befinden. Wenn Sie Zeitzonen anpassen möchten, müssen Sie weitere Informationen sammeln, z. B. Stunden, Minuten und Sekunden.

0

Ihre Lösung hängt von Ihrer Anwendung und Ihren Anforderungen ab.

Ich würde zuerst UTC + Offset in Ihren Datenstrukturen speichern, so dass es für jede Zeitzone angezeigt werden kann.

Am wahrscheinlichsten, wenn eine Aufgabe oder ein Treffen am 21. März um 12 Uhr in London fällig ist, dann wird es am 21/März in Adelaide um 21.30 Uhr stattfinden (+0930), aber das ist eine Anwendungsanforderung, die keinen unheilvollen Zeitzonenstandard darstellt .

Wenn Sie die ultimative Flexibilität wünschen, fügen Sie ein Flag hinzu, das die Gleichzeitigkeit in jeder Zeitzone oder zur gleichen Zeit gleichzeitig machen kann, egal wo Sie sind (gestaffelt) und das Ereignis entsprechend anzeigen.

0

Sie können das Datum in einer Zeitzone speichern, die für die Zeitzone geeignet ist. Dies wird Ihnen bei Ihren Berechnungen helfen. SQL Server 2008 unterstützt zum Beispiel eine datetimeoffset that does precisely this. Alternativ können Sie, wenn Sie SQL 2005 mit etwas Aufwand verwenden, Ihren eigenen SQL CLR-Datentyp schreiben, um dies zu unterstützen.

Verwandte Themen