So che questa è una domanda abbastanza comune, ma non mi sento come se le risposte che ho trovato risolvessero davvero il problema. Illustrerò il mio caso d'uso specifico e presenterò riepiloghi alle informazioni provenienti da altre risposte SO e sul web.Timestamp: iso8601 vs unix timestamp
Per il servizio che sto scrivendo, le voci del database vengono create e archiviate sia sui dispositivi mobili che sul nostro sito Web e devono essere sincronizzate in entrambi i modi. Al momento stiamo prendendo di mira Android e iOS, che utilizzano entrambi sqlite come database relazionale. Il lato server è implementato in Python usando Django con MySQL, ma altre soluzioni potrebbero sostituirlo in futuro.
La sincronizzazione verrà implementata seguendo le idee descritte in questa risposta SO: https://stackoverflow.com/a/5052208/2076094. Per la sincronizzazione utilizzeremo un timestamp impostato solo dal server e sincronizzato con i client, l'ultimo_sincronizzato_data e il timestamp per la creazione e l'aggiornamento dell'oggetto. Poiché gli oggetti si riferiscono a qualcosa che l'utente ha fatto in determinati momenti, hanno anche informazioni sull'orario.
La mia domanda riguarda solo la rappresentazione interna del tempo utilizzato per questi timestamp. La rappresentazione utente nell'interfaccia utente è una versione localizzata e formattata della rappresentazione interna. Ci sono un certo numero di modi diversi sia nei linguaggi di implementazione che nei diversi database usati per rappresentare i timestamp. Dopo un bel po 'di ricerche sembrano esserci solo a soluzioni valide sinistra:
- Unix-tempo
- ISO8601
Questo article che era su Hacker News (due volte) suggerisce di usare il tempo UNIX e presenta una buona argomentazione. La discussione su HN, come è prevedibile, diverge un po 'attorno ai due punti sopra delineati e poi alcuni.
La mia conlusione finora è che i timestamp di Unix-time sono più facili da gestire, ma non sembrano essere il modo comune per andare a Django. Quasi tutti gli esempi di codice che ho trovato, dal tutorial di Django a molti altri siti, utilizzano un DateTimeField nel model.py che viene mappato su una sorta di campo data in SQL, i termini esatti che dipendono dal database utilizzato.
Lo svantaggio di utilizzare le date ISO8601 per la trasmissione e l'archiviazione è che devono essere analizzati per creare il tipo di data della rispettiva lingua di implementazione. Non è difficile, ma piuttosto fastidioso. Per ogni singola lingua che stiamo usando, hai bisogno di una (piccola) libreria o almeno di un codice più lungo di quello che spereresti. Non è molto carino, crea dipendenze ed è probabilmente leggermente più lento. I timestamp di Unix-time non hanno questo problema in nessuna lingua che conosco.
L'altra cosa è che puoi facilmente metterti nei guai usando i campi "smart" Data o Timestamp nel database (e durante l'analisi). Ci sono molte domande su SO riguardo alla magia del tempo che rovina tutto. Il limite del mio link è stato raggiunto, quindi non posso postarne alcuno, ma ne troverai facilmente;)
Potremmo usare un formato semplificato che non include le informazioni sul fuso orario e utilizzare sempre UTC. Useremo comunque l'UTC, ma sembra che se si usi ISO8601, si potrebbe anche usare un formato che sia universalmente compreso e non ambiguo. Unix-time è sempre in UTC, quindi non devi mai preoccuparti di questo.
Naturalmente ISO8601 ha il vantaggio di essere leggibile dall'uomo quando si guarda il database non elaborato e non dovrò riscrivere un paio di righe di codice poco prima del 2038, ma ciò non sembra compensare aspetti negativi.
Sembra che scrivendo le cose ho già la mia risposta;) Comunque, mi piacerebbe sapere cosa pensano gli altri e cosa fai nei tuoi progetti. Si prega di fornire una breve descrizione del proprio caso d'uso, in modo che altri possano classificare meglio il proprio input.
Grazie!
sempre utilizzare per il fuso orario UTC e convertire l'ora locale ogni volta che hai bisogno di un'ora locale. –
@AnthonyHunt .... Perché? Il tempo Unix è un numero. * il suo valore è sempre GMT * è molto più breve (unix timestamp richiede un numero intero a 32 bit, mentre i timestamp richiedono 200 bit di ASCII) * è la piattaforma/lingua agnostico e gestito da tutti i linguaggi di programmazione * 64 sistemi operativi po utilizzano un numero intero di t_time a 64 bit quindi durerà la morte termica dell'universo Quindi sono davvero curioso del motivo per cui sceglieresti di sacrificare mobilità, dimensioni e affidabilità per l'analisi delle stringhe? – Ancarius