Python tzinfo e l'ora legale
-
08-07-2019 - |
Domanda
(Sono nuovo di Python e Google App Engine, ti prego di perdonarmi se le mie domande sembrano basilari).
Mi sto divertendo un mondo a provare a gestire più fusi orari dell'utente nella mia applicazione Google App Engine.
Ecco i miei vincoli:
- Se un utente inserisce l'ora in un input, sarà l'ora locale (incluso l'ora legale, se del caso).
- Se un utente non inserisce l'ora, il sistema deve inserirla per ora locale (inclusa l'ora legale, se del caso).
- Quando la data e l'ora sono visualizzate per l'utente, deve essere nell'ora locale (incluso l'ora legale, se del caso)
Comprendo che l'ora verrà archiviata internamente come UTC con un oggetto tzinfo e che il motore dell'app memorizzerà i modelli con l'ora UTC.
In precedenza pensavo di aver risolto tutto chiedendo all'utente di specificare il fuso orario nelle preferenze. Quindi, vorrei semplicemente caricare le loro preferenze e aggiungere quel tzinfo a qualsiasi oggetto datetime in riferimento a quell'utente.
Tuttavia, la nostra recente ora legale l'ha rotto. Si scopre che non avevo implementato correttamente dst () nei miei oggetti tzinfo. A quanto ho capito, devo determinare se l'ora legale è attualmente attiva e, in tal caso, restituire l'offset corretto per tzinfo.
Il problema è che non ho idea di come determinare se l'ora legale del fuso orario è attuale o meno. Mi sto perdendo qualcosa di ovvio?
Soluzione
Se puoi, ti consiglio di dare un'occhiata al pacchetto python-dateutil
, che ha oggetti tz pre-costruiti per tutti i fusi orari, comprese le informazioni di offset dell'ora legale. Non credo che ci sia un modo per " basta sapere " se l'ora legale è attiva o meno senza i dati di supporto ... è la data guidata per la maggior parte dei fusi orari (o, almeno, i fusi orari che supportano l'ora legale) e le date variano in base all'usanza locale, alla politica e ad ogni altra cosa.
Altri suggerimenti
Vedo alcuni problemi qui.
Se l'utente inserisce l'ora, la inserisce nel fuso orario locale, ma come fai a sapere quale è? Europa / Vilnius o Europa / Madrid? O forse Australia / Melbourne? Se non conosci il fuso orario, la data / ora diventa " ingenuo " ;.
L'unico database del fuso orario che è considerato appropriato e accurato (considerando lo stato di flusso costante) è il fuso orario db Olson, disponibile per Python come pytz pacchetto. Permette di convertire facilmente date / orari tra fusi orari: prima prendi la data / ora e il fuso orario dall'utente, localizza la data / ora nel fuso orario dell'utente, quindi prendilo come utc, pronto per il salvataggio nel tuo database. La visualizzazione è al contrario: ottieni data / ora dal database, localizza in utc, quindi visualizza come fuso orario dell'utente.
E l'ultima cosa: non esiste una trasformazione dell'ora legale automatica . Nel caso di date / orari ambigui, è necessario sapere in anticipo in quale fuso orario viene inserito l'orario. Questa è la nostra realtà umana.