2017-07-11 4 views
0

Ich ging durch die Übung der Erstellung eines Alexa Skill to read local events von einem ICS-Kalender. Es funktioniert alles gut, außer dass, wann immer es ein Ereignis gibt, das um 7 Uhr EDT oder später beginnt, die Fähigkeit es am nächsten Tag liest.Alexa Kalender: Amazon Lambda Lokal vs UTC Zeitzone Mismatch

Dies scheint ein Zeitzonenproblem zu sein. Ich hosste die Logik auf Amazon Lambda, die meiner Meinung nach auf UTC eingestellt ist. Das Einstellen meines Google-Kalenders auf UTC hilft nicht. Das Hinzufügen von process.env.TZ = 'America/New_York' zu meinem JavaScript-Code node.js hilft auch nicht.

Mir wurde gesagt, dass ich aus Gründen der Privatsphäre die Zeitzonen von Alexa Benutzern nicht entdecken kann. Aber ich muss die Zeitzone der Skill-Benutzer nicht ermitteln, da es eine sichere Annahme ist, dass sie sich alle in derselben Zeitzone befinden wie mein lokaler Veranstaltungskalender Eastern Daylight. Alles, was ich tun muss, ist Lambda zu wissen, dass die Ereignisse zwischen 19 Uhr und Mitternacht Ortszeit am nächsten Tag nicht passieren. Irgendwelche Ideen, was ich tun kann? Vielen Dank.

Antwort

3

UTC ist die einzige eindeutige und deterministische Zeitzone für Zeiten in der Vergangenheit und in der Zukunft, sowie jetzt.

Es ist die einzige Zeitzone, wo zum Beispiel, und zwar unabhängig von den Aktionen der lokalen oder nationalen Maßnahmen der Regierung die Zeit um eine Sekunde nach dem 01.59.59 wird nie an einem Tag 3.00.00 sein. US/Eastern hingegen erlebt dies einmal im Jahr im Frühjahr. Umgekehrt gibt es zwei Mal an einem Tag im Herbst, wo die Wanduhrzeit 02:59:59 zweimal an einem Tag auftritt, eine Stunde auseinander. Aber in UTC werden diese beiden Zeiten korrekt durch zwei unterschiedliche Werte dargestellt, die 3600 Sekunden auseinander liegen, wobei einer eine Stunde nach dem anderen auftritt.

Beim Entwerfen einer Anwendung zur Verarbeitung von Datumsangaben ist wenig Raum für Diskussionen, dass die korrekte Lösung darin besteht, Datumsangaben als UTC zu speichern und dann eine Zeitzonenbibliothek zu verwenden, um sie zu konvertieren. Die Konvertierung in UTC ist die einzige Möglichkeit, eine verlustfreie Konvertierung zu gewährleisten.

Google calendar follows this best practice und speichert Ihre Ereignisse nicht in Ihrer lokalen Zeitzone, sondern konvertiert und speichert alle Ereignisse als UTC und konvertiert sie dann erneut und zeigt sie entsprechend den Zeitzoneneinstellungen Ihres Kalenders an.

Wenn (?) Es eine sichere Annahme ist, dass der Benutzer die Ereignisse basierend auf America/New_York hören möchte, dann verwenden Sie eine Zeitzonenbibliothek, um Datum/Uhrzeit des Systems zu konvertieren (jeder Server sollte immer "lokal" haben) Zeitzone auf UTC eingestellt, und dies ist der Fall für Lambda) und das Ereignis Datum/Uhrzeit von UTC bis zur Ziel-Zeitzone, bevor Sie Ihren Vergleich durchführen.

Vermutlich kann die Google Kalender-API auch für Ihre Zeitzoneneinstellung abgefragt werden, und Sie können diesen Wert für die Conversions verwenden. Oder Sie können den Benutzer fragen.

Verwandte Themen