2013-08-23 23 views
8

I Zeitzone für eine Anwendung durch offset-from-UTC am Speicherung dieser Drop-Down mit:Was sind die "Standard" -Zeitzonenabkürzungen?

<select id="timezone" name="timezone" > 
<option value="-12">[UTC - 12] Baker Island Time</option> 
<option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option> 
<option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option> 
<option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option> 
<option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option> 
<option value="-8">[UTC - 8] Pacific Standard Time</option> 
<option value="-7">[UTC - 7] Mountain Standard Time</option> 
<option value="-6">[UTC - 6] Central Standard Time</option> 
<option value="-5">[UTC - 5] Eastern Standard Time</option> 
<option value="-4.5">[UTC - 4:30] Venezuelan Standard Time</option> 
<option value="-4">[UTC - 4] Atlantic Standard Time</option> 
<option value="-3.5">[UTC - 3:30] Newfoundland Standard Time</option> 
<option value="-3">[UTC - 3] Amazon Standard Time, Central Greenland Time</option> 
<option value="-2">[UTC - 2] Fernando de Noronha Time, South Georgia &amp; the South Sandwich Islands Time</option> 
<option value="-1">[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time</option> 
<option value="0">[UTC] Western European Time, Greenwich Mean Time</option> 
<option value="1">[UTC + 1] Central European Time, West African Time</option> 
<option value="2">[UTC + 2] Eastern European Time, Central African Time</option> 
<option value="3">[UTC + 3] Moscow Standard Time, Eastern African Time</option> 
<option value="3.5">[UTC + 3:30] Iran Standard Time</option> 
<option value="4">[UTC + 4] Gulf Standard Time, Samara Standard Time</option> 
<option value="4.5">[UTC + 4:30] Afghanistan Time</option> 
<option value="5">[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time</option> 
<option value="5.5">[UTC + 5:30] Indian Standard Time, Sri Lanka Time</option> 
<option value="5.75">[UTC + 5:45] Nepal Time</option> 
<option value="6">[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time</option> 
<option value="6.5">[UTC + 6:30] Cocos Islands Time, Myanmar Time</option> 
<option value="7">[UTC + 7] Indochina Time, Krasnoyarsk Standard Time</option> 
<option value="8">[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time</option> 
<option value="8.75">[UTC + 8:45] Southeastern Western Australia Standard Time</option> 
<option value="9">[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time</option> 
<option value="9.5">[UTC + 9:30] Australian Central Standard Time</option> 
<option value="10">[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time</option> 
<option value="10.5">[UTC + 10:30] Lord Howe Standard Time</option> 
<option value="11">[UTC + 11] Solomon Island Time, Magadan Standard Time</option> 
<option value="11.5">[UTC + 11:30] Norfolk Island Time</option> 
<option value="12">[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time</option> 
<option value="12.75">[UTC + 12:45] Chatham Islands Time</option> 
<option value="13">[UTC + 13] Tonga Time, Phoenix Islands Time</option> 
<option value="14">[UTC + 14] Line Island Time</option> 

PHP, ich wirklich nicht die einfachsten Möglichkeiten haben diese Abkürzungen zu Zeitzone zu konvertieren, meine einzige Option programmatisch wäre es, eine Liste von etwa 400 Zeitzonenabkürzungen zu sortieren. Kennt jemand die Liste, die mit diesem Drop-Down dessen verbunden ist, was jeder der Zeitzonen ist und was sie sind, wenn die Sommerzeit läuft? (Ich nehme an, dass ich beide Listen manuell definieren muss)

EDIT: analysierte diese Liste zu einer einzelnen Abkürzung für jede Zeitzone, aber sie sind nicht die "populären".

Meine neue Liste

[-12] => kwat 
[-11] => bst 
[-10] => ahst 
[-9.5] => ckhst 
[-9] => ahdt 
[-8] => akdt 
[-7] => east 
[-6] => cst 
[-5] => act 
[-4.5] => ant 
[-4] => acst 
[-3.5] => negt 
[-3] => adt 
[-2] => addt 
[-1] => azost 
[-0] => azomt 
[1] => bst 
[2] => bdst 
[3] => amt 
[3.5] => irst 
[4] => adt 
[4.5] => aft 
[5] => aktt 
[5.5] => ist 
[5.75] => npt 
[6] => aktst 
[6.5] => burt 
[7] => almst 
[8] => bnt 
[8.75] => cwst 
[9] => cdt 
[9.5] => cast 
[10] => chost 
[10.5] => cst 
[11] => anat 
[11.5] => lhst 
[12] => anast 
[12.75] => chast 
[13] => anast 
[14] => anast 

Code:

$abbr = DateTimeZone::listAbbreviations(); 

$offsets=array('-12','-11','-10','-9.5','-9','-8','-7','-6', 
    '-5','-4.5','-4','-3.5','-3','-2','-1','-0','1','2','3','3.5', 
    '4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5', 
    '10','10.5','11','11.5','12','12.75','13','14'); 
$new = array(); 
$count = 0; 
$found = false; 
while($count < count($offsets)) 
{ 
    foreach($abbr as $k => $v) 
    { 
     foreach($v as $tz) 
     { 
      if($tz['offset'] == $offsets[$count]*3600) 
      { 
       $new[$offsets[$count]] = $k; 
       $found = true; 
       break; 
      } 
     } 
     if($found) 
     { 
      $found = false; 
      break; 
     } 
    } 
    $count++; 
} 
print_r($new); 
+1

Werfen Sie einen Blick auf [DateTimeZone :: listAbbreviations] (http://www.php.net/manual/en/datetimezone.listabcuriarations.php). Die gewünschte Information ist wahrscheinlich dort oder in einer der neueren Methoden. –

+1

Das ist die Liste von 400 Abkürzungen, die ich nicht jede Seitenladung analysieren kann. Ich brauche nur diese 24, ich nehme an, irgendwo gibt es eine gemeinsame Liste, die ich gerade nicht finden konnte. Dieses spezielle Dropdown war sogar schwer zu finden, die anderen waren nicht so nett. :/ – ABlankenship

+0

Sie können Ihre Liste programmatisch erstellen und im Server-Dateisystem speichern. Wenn Sie es brauchen, überprüfen Sie sein Alter und bauen Sie es um, wenn es älter ist als, sagen wir, 24 Stunden. Dann schließe es ein/brauche es auf die normale Weise. Es ist nicht die Liste, nach der Sie fragen, aber es bedeutet, dass Sie die gesamte Liste nur einmal pro Tag analysieren. –

Antwort

24

Was die "Standard" sind Zeitzone Abkürzungen?

Es gibt keine Standards dafür. Zeitzonenabkürzungen werden von niemandem offiziell koordiniert. Es gibt einige verwendet in der IANA TZDB, aber viele von denen wurden nur zufällig ausgewählt. Es gibt oft Diskussionen darüber, welche Abkürzungen verwendet werden sollten. Schauen Sie zum Beispiel, wie viele Beiträge es gab über australische Abkürzungen in the list archives for April 2013.

Eine andere Liste der Zeitzonenabkürzungen finden Sie here. Wenn Sie genau hinsehen, werden Sie sehen, dass viele nicht eindeutig sind. Zum Beispiel könnte CST "Central Standard Time" (USA), "China Standard Time" oder "Cuba Standard Time" sein. EST könnte "Eastern Standard Time" (USA) oder "Eastern Standard Time" (Australien) sein.

Einige Nicht-Australier bevorzugen möglicherweise AEST, aber wer soll sagen, dass A für Australien und nicht für Amerika sein sollte?

Ein weiteres sehr häufiges Beispiel, einige Leute benutzen HAST für Hawaii, während andere HST verwenden, weil sie weniger über die Aleuten in Alaska interessieren könnte (was die A darstellen soll).

Der Punkt ist, dass jede Liste von Zeitzonenabkürzungen, wo immer Sie eine finden, subjektiv und eigensinnig sein wird. Es gibt keinen Standard.

Ich bin Zeitzone zu speichern für eine Anwendung ausgeglichen durch dieses Auswahlmenü mit:

Bitte nicht das tun. Eine Zeitzone ist nicht ein Offset, und es gibt viele mehr als 24 von ihnen. Bitte lesen Sie the timezone tag wiki, insbesondere den Abschnitt "Zeitzone! = Offset".

Von Ihren Kommentaren:

ich dies erkennen jetzt, aber der Rest meiner Anwendungslogik hängt davon ab, es auf diese Weise schon, und ich erst heute diese abgeschlossen hat, also keine Zeit, es zu ändern.

Dann werden weiterhin viele Fehler in Ihrer Anwendung vorhanden sein. Sie können dies nicht zuverlässig tun - auch nicht, wenn Ihre App nur in den USA läuft. Es spielt keine Rolle, auf welcher Sprache oder Plattform Sie sich befinden. Jede Implementierung, die dies tut, wird viele Konvertierungsfehler haben.

Ich bin ok mit Hardcoding diese Arrays, ich weiß einfach nicht, was die beliebten Zonen außerhalb der USA sind, dachte ich, eine solche Liste wäre schon irgendwo vorhanden.

Wenn es um Zeitzonen geht, sollten Sie nichts fest codieren. Zeitzonenregeln ändern sich ständig, weil sie von Politikern in jedem Land der Welt kontrolliert werden. Es gibt Updates, die mehrmals pro Jahr an die IANA time zone database freigegeben werden. Auf der PHP-Seite macht die PHP documentation klar, welche Version derzeit verfügbar ist, und dass Updates über PECL's timezonedb gehandhabt werden - das zieht seine Daten von IANA.

In Bezug auf was "populär" ist - das ist auch sehr subjektiv. Die Zonen in der TZDB sind alle aus dem einen oder anderen Grund vorhanden. Der einzige Ort, den ich kenne, der versucht hat, dies zu begrenzen, ist ActiveSupport::TimeZone von Ruby on Rails. Sie behaupten, eine "sinnvolle Teilmenge von 146 Zonen" zu haben, die Sie in der MAPPING Konstante auf dieser Seite sehen können. Aber sie sagen nicht, nach welchem ​​Prozess sie entschieden haben, was als sinnvoll erachtet wird, und es gibt klare Versäumnisse. Wenn Sie nicht genau wissen, wo sich jeder einzelne Ihrer Benutzer befindet, würde ich nicht versuchen, zu entscheiden, auf welche Zonen ich mich beschränken soll.

Wenn das, was Ihr nach etwas anderes, dass ein Drop-Down-Liste aller 578 Zonen im TZDB, können Sie eines dieser Ansätze versuchen:

  • Präsens zwei Dropdown-Menüs. Der erste, der ein Land auswählt. Die Sekunde, um eine Zone innerhalb dieses Landes zu wählen. In PHP können Sie sehen, dass beim Aufruf DateTimeZone::listIdentifiers ein optionaler $country Parameter akzeptiert wird, um die Liste zu filtern.

    Ein gutes Beispiel hierfür ist in den Einstellungen für Google Kalender:

    Google Calendar Time Zone Settings

  • Verwenden Sie eine Kennfeldsteuerung, damit Ihre Benutzer ihre Zeitzone nach Ort auswählen können. Es gibt viele davon, aber mein Favorit ist this one für JavaScript.

    Zum Beispiel könnte es so aussehen:

    Map-based TZ picker

Beachten Sie, dass, während es die TZDB Abkürzung von EDT hier zeigt -, dass nur für eine Anzeige Bequemlichkeit verwendet wird. Unter der Haube wählen Sie einen Wert wie America/New_York.

Schließlich müssen Sie für jeden Benutzer ihren IANA-Zeitzonenschlüssel speichern, z. B. America/New_York. Sie können keine korrekten Zeitzonenumwandlungen mit einem Wert von -5 vornehmen, da Sie nicht alle Regeln für den Wechsel zu -4 haben.

aktualisiert

Eines, was mir von Ihrer ursprünglichen Post war nicht klar, aber Sie in den Kommentaren zu klären, ist, dass Sie dies mit einer Zielereignis Zeitzone zu wählen. Ich denke, ich hätte zuerst nach dem Zusammenhang fragen sollen. Ich habe mich dem aus der Perspektive der Auswahl einer einzelnen Zeitzone für Ihren Benutzer und nicht einer bestimmten Zeitzone für ein bestimmtes Ereignis genähert.

Alle Sie wirklich Notwendigkeit für ein Ereignis im richtigen Moment ist der Offset für diesen Moment. Sie könnten also ein Dropdown-Feld verwenden, wie das, das Sie in Ihrer Frage gezeigt haben - aber ich würde keine Zonennamen auslassen. Es wäre buchstäblich eine Liste von Offsets von UTC-12:00 bis UTC+14:00. Offenbar haben Sie bereits festgestellt, dass auch ein Versatz von 30 Minuten und 45 Minuten besteht. Sie können Ihre Annahmen überprüfen here, wenn Sie möchten.

Das allgemeine Problem ist, dass viele Leute nicht wissen, was der Offset sein sollte. Wenn Sie eine Liste mit dem Standard Offset für jeden Zonennamen einfügen, können Sie den Benutzer dazu verleiten, den falschen Offset auszuwählen. Zum Beispiel könnten sie über ein Datum im Sommer sprechen, das in die US Eastern Daylight Time (-4) fallen sollte, aber sie wählen stattdessen die -5 Auswahl, weil sie "Eastern" sehen. Also hilft das Entfernen der Namen.

Wenn Sie den Weg gehen, den ich ursprünglich vorgeschlagen habe und sie eine tatsächliche IANA-Zeitzone auswählen, wird das viel besser für viele Szenarien funktionieren. Allerdings gibt es immer noch ein Szenario, über das Sie nachdenken müssen - wie Sie mit mehrdeutigen und ungültigen mal umgehen können. Diese treten während der DST-Übergänge auf.

Zum Beispiel könnte ich wählen America/New_York, und wählen Sie eine Zeit von 1:00 Uhr am 3. November 2013. Es gibt zwei verschiedene Instanzen davon aufgrund der Fallback-Übergang (eine in EDT bei -4 und eine andere in EST bei -5). Ihre App müsste dies überprüfen und den Benutzer fragen, welche der beiden gemeint ist. Ebenso, wenn ich am 10. März 2013 um 2:00 Uhr morgens eintrage, sollte mir deine App mitteilen, dass diese Zeit in dieser Zone nicht existiert (aufgrund des Spring-Forward-Übergangs). Wenn Sie die Ereigniszeiten tatsächlich speichern möchten, stellen Sie sicher, dass Sie entweder die Datum-Zeit-Offset-Kombination speichern oder den Offset anwenden, um eine Datums- und Uhrzeitangabe zu erhalten, die sich auf UTC bezieht. Sie wollen nicht, dass es eine Frage darüber gibt, welcher tatsächliche Zeitpunkt durch das Ereignis repräsentiert wird.

+1

Wow, tolle Antwort. Du gewinnst, ich repariere die ganze Sache lol. Enttäuschend aber, weil meine Countdown-Timer und so in allen meinen Tests (zumindest innerhalb der USA) gut funktionierten. Ich muss jetzt nur noch die ABBR neben der Uhrzeit anzeigen. Ich denke, das ist ein besserer Weg, es zu tun. Was ich mache, ist wie Live-Events, also kann ein Benutzer mehrere haben, es ist nicht so, dass ein Benutzer seine eigene Zeitzone einmal auswählt und das ist es, es könnte mehrere Male sein und sie könnten mehrere Events in anderen Ländern für alle haben Ich wollte es einfach halten. Die Auswahl von Land + Zeitzone sollte gut funktionieren. Vielen Dank! – ABlankenship

+0

Auch, nach Ihrem letzten Absatz, habe ich das behoben, indem ich Javascript dem Benutzer zeigte, in welcher Zeitzone sie sich gerade befanden, damit sie -4 für EDT (UTC) wählen konnten, obwohl -5 der richtige GMT-Code für diese Zone ist. Ein bisschen hacky, aber es funktionierte für Ereignisse in naher Zukunft, bevor es sich änderte. – ABlankenship

+0

GMT/UTC sind für diesen Zweck gleich. Es ist nicht so, dass -5 korrekt ist, es ist einfach der "Standard" oder "Basis" Offset. Selbst in diesem Google Kalender-Beispiel wird das falsch dargestellt, indem nur der Standard-Offset angezeigt wird - nicht der aktuelle, oder (in Ihrem Fall) derjenige, der für die Ereigniszeit gilt. Siehe auch meine aktualisierte Antwort. –