(Dis) vantaggi di datetime rispetto a long in applicazioni globalmente utilizzate [closed]

4

Attualmente sto progettando un'applicazione web / mobile il cui numero di utenti verrà distribuito tra i diversi fusi orari degli Stati Uniti con un potenziale di scalabilità anche in altri Paesi e fusi orari

Ho lavorato con molte altre app utilizzate a livello globale e ho notato che utilizzavano tutti i datetime per registrare timestamp con il fuso orario predefinito che è quello in cui generalmente l'applicazione è ospitata. Nel mostrare i tempi, in genere non si preoccupano delle preferenze dell'utente (locale) e semplicemente visualizzano il timestamp con il TZ e lasciano all'utente l'autorizzazione a convertire se (s) desidera.

Sto intrattenendo l'idea di passare da quel paradigma e registrare i timestamp come un tempo globale (GMT) in lunghe miglia, indipendentemente dalla posizione dell'utente e dalla raccolta delle impostazioni locali dell'utente tramite il loro IP o lasciare che cambino la loro TZ come preferenza in il loro profilo, che in seguito verrebbe utilizzato per la formattazione di visualizzazione di tutti i loro milli lunghi GMT. Sembra una soluzione più semplice che confondere il design dell'app con TZ.

Sono curioso di ricevere feedback su pro e contro su questo approccio. Sono anche curioso di sentire alcune spiegazioni sul perché il tipo di dati datetime con suddivisione in zone dell'OMO, sovracompilato in termini di tempo, sia mai stato utilizzato tra i database e non un singolo fuso orario uniforme con conversioni solo per la visualizzazione.

    
posta amphibient 03.01.2013 - 18:32
fonte

4 risposte

10
  1. Non penso che otterrai molto di più memorizzando tutto datetime s come long s. Ogni lingua che posso immaginare ha dei modi per convertire le date in altri formati (stringa, lungo) usa il formato preferito per il tuo database .

  2. Memorizza le date in UTC . Penso che questo abbia senso per quasi tutte le applicazioni, dal momento che molte lingue e API hanno un modo per ottenere Now () in UTC. Inoltre, per la maggior parte dei dispositivi e dei browser è semplice calcolare l'offset del fuso orario. Quindi è semplice aggiunta per la visualizzazione dell'ora locale dell'utente. Ti risparmierai molto mal di testa lungo la strada.

risposta data 03.01.2013 - 18:57
fonte
4

Ci sono molte complicazioni nella conversione tra fusi orari, specialmente quando si considera l'ora legale e il pugno che non ha nemmeno un incremento di un'ora. Se stai utilizzando un database con un robusto supporto di TIMESTAMP , il passaggio allo storage intero non ti consente di accedere al gran numero di operazioni disponibili. Potrebbe sembrare una cosa opportuna da fare, ma dover implementare nuovamente tutte le conversioni nel proprio codice è ridondante e soggetto a errori. Perché reinventare una ruota già provata?

SQL92 definisce una clausola AT TIME ZONE che consente di rielaborare un'ora in un fuso orario in un altro (esempio PostgreSQL):

-- Grab a value in one time zone and convert it to another
SELECT TIMESTAMP WITH TIME ZONE '2013-01-03 12:34:56 EST' AT TIME ZONE 'MST';

-- Store it as the user provided it, in his preferred time zone
INSERT into bar (foo) VALUES ('2013-01-03 12:34:56 EST');

-- Retrieve it in its original form
SELECT foo FROM bar WHERE ... ;

-- Retrieve it in the time zone some other user prefers
SELECT foo AT TIMEZONE 'PST' FROM bar WHERE ... ;

Diversi database, Oracle e PostgreSQL tra loro, implementano questo.

I am also curious to hear some explanations why the, IMO overcomplicated time zoned datetime data type has ever been used across databases and not a uniform single time zone with conversions just for display.

Non c'è niente di complicato in questo; i tipi suddivisi in zone memorizzano solo più informazioni. A volte è importante conoscere il fuso orario in cui si è verificato un evento e la conversione in un singolo fuso orario cancella irrevocabilmente tali informazioni. Se stai facendo una promozione di marketing e vuoi sapere quali clienti hanno effettuato gli ordini durante l'ora di pranzo, un ordine che sembra essere stato piazzato a mezzogiorno del GMT non è molto utile quando è stato effettivamente messo a colazione a New York. Per ottenere tutto ciò, dovrai reinventare le ruote di cui sopra, che il tuo database potrebbe aver già fatto per te.

    
risposta data 03.01.2013 - 20:37
fonte
3

Questo dipende molto dallo scopo delle informazioni datetime.

Per un'app di calendario, la possibilità di tenere traccia dei fusi orari è essenziale. Per un demone di registrazione, avere tutti i record nella stessa TZ è abbastanza conveniente. Che tipo è la tua app?

OTOH Non vedo quale sarà il tuo guadagno dall'usare un int lungo per memorizzare il timestamp. Questo mi sembra un'ottimizzazione prematura; puoi anche archiviare i dati come GMT e avere gli orologi dei tuoi server sempre impostati su GMT (come molti di noi fanno). Se questo è il punto della tua domanda, allora sì, avere tutto internamente memorizzato nella stessa TZ può essere una buona idea.

    
risposta data 03.01.2013 - 18:47
fonte
1

Il GMT sarà sempre lo stesso senza modifiche per gli scenari di Ora legale? Potrei immaginare se improvvisamente una serie di dati di data è stata spostata a causa di DST che potrebbe essere un problema e quindi potrebbe essere necessario contemplare quali regole di business avresti per questo.

"Epic Fail" di Jon Skeet ha una sezione su Fusi orari che trovo interessante e abbastanza divertente allo stesso tempo.

    
risposta data 03.01.2013 - 18:49
fonte

Leggi altre domande sui tag