Come rendere sensibile un fuso orario del sistema legacy?

5

Ho bisogno di implementare i fusi orari in un sistema Delphi molto grande e vecchio, dove c'è un database SQL Server centrale e possibilmente centinaia di installazioni client in tutto il mondo in fusi orari diversi. L'applicazione interagisce già con il database usando solo la data / ora del server del database. Quindi, tutti i timestamp salvati sia nel database che sui computer client sono la data / ora del server del database quando è successo, mai l'ora del computer client.

Quindi, quando un cliente sta per visualizzare la data / ora di qualcosa (come una transazione) che proviene da questo database, deve mostrare la data / ora convertita nel fuso orario locale. Questo è dove mi perdo.

Naturalmente, suppongo che in SQL dovrebbe esserci qualcosa per riconoscere il fuso orario e convertire dinamicamente un campo DateTime. Non sono sicuro se esiste una cosa del genere. Se è così, sarebbe perfetto, ma in caso contrario, ho bisogno di capire un altro modo.

Questo sistema Delphi (più progetti) utilizza il database SQL Server utilizzando componenti ADO, controlli basati su dati VCL e QuickReports (utilizzando origini dati). Quindi, ci sono molti posti in cui i dati vanno direttamente dalla query del database al rendering sullo schermo, senza alcun codice per mettere effettivamente questi dati sullo schermo. Alla fine, ho bisogno di sapere quando e come devo ottenere il tempo correttamente convertito?

Qual è il modo corretto per garantire di gestire correttamente date e orari in un'applicazione legacy?

    
posta Jerry Dodge 07.12.2012 - 18:25
fonte

2 risposte

5

Date e fusi orari sono cose complicate e, in generale, a prescindere dal tipo di stack tecnologico su cui si sta lavorando, raramente una soluzione chiavi in mano.

La maggior parte dei database memorizzerà una data o un timestamp come poco più della data esatta o timestamp che gli è stata data. Quando si parla con un database tramite query, generalmente si presuppone che tutte le date e gli indicatori di data e ora rappresentino un punto temporale in uno stesso fuso orario. In altre parole, se scrivo una query per vedere se il 2 agosto 2012 16:10 sia precedente alla stessa data alle 17:10, allora valuterò la verità restituendomi quel record. Supponiamo che il record sia stato salvato come 4:10 pm Eastern Standard Time quando il mio server di database si trova in Pacific Standard Time. Il database è agnostico del fuso orario e ora la mia query non restituisce i dati che mi aspetto.

Converti tutte le date e le ore delle applicazioni in UTC o GMT prima di persistere

Lingue come Java, Javascript e C # trattano date e orari in modo leggermente diverso. In genere misurano il tempo come un numero di millisecondi da un dato punto universale nel tempo. Questo è il tempo universale in quanto quel numero specifico di millisecondi da 0 rappresenta un numero di date o orari diversi in fusi orari diversi in un dato punto. La maggior parte di queste lingue ha in genere un'API data e ora solida o una buona libreria di terze parti che consente di visualizzare il millesimo di secondo in un numero di fasce orarie il più indolore possibile.

Se non diversamente specificato, se utilizzo un'API di accesso ai dati standard in un linguaggio comune, la maggior parte prenderà un oggetto data e lo convertirà nella data e ora del fuso orario predefinito del server nel formato di database specificato. Scopri come i tuoi dati di lingua accedono alle API e alle date di memorizzazione dei database e come li interpreta dal database e prova a memorizzare le date a livello di database in GMT. Allo stesso modo, quando esegui una query, assicurati che gli oggetti Date o le variabili nella tua lingua rappresentino un conteggio millisecondo equivalente all'ora di data GMT memorizzata nel database.

Fusi orari per le date utilizzate in Business Logic

Ciò che intendo è che forse se hai una colonna Data modificata nel tuo database, allora potrebbe non essere importante per la logica di business, tuttavia una Data appuntamenti di colonna probabilmente sarà importante.

Da qualche parte nello schema è necessario determinare dove sono archiviati dati specifici della locale e memorizzare il fuso orario per definire quella locale nella tabella genitore appropriata. La logica aziendale che prende in considerazione le date o la logica di presentazione che sta preparando le date per la visualizzazione deve essere in grado di recuperare il fuso orario appropriato in modo che quando paragono dalle 16:10 alle 17:10, sto confrontando le date dall'apposito spazio universale tempo. 16:10 EST e 16:10 PST sono punti separati nel tempo universale. Anche in questo caso una buona API di data e ora o una libreria di terze parti facilita il confronto delle date, quando capisci la natura sottostante di come funzionano le date in quel linguaggio di programmazione.

Business Logic dovrebbe essere sottoposto a refactoring in modo da essere al corrente del fuso orario.

Logica di presentazione dovrebbe essere refactored per presentare un valore di visualizzazione che visualizza in modo appropriato i dati corretti per il fuso orario appropriato appropriato.

Un ultimo pensiero da considerare quando si esegue questo lavoro è scrivere esaurienti test unitari che esauriscano completamente molti tipi di combinazioni di data e ora per assicurarsi che tutta la logica aziendale funzioni come previsto.

    
risposta data 07.12.2012 - 19:23
fonte
0

Il problema qui è che le viste sono collegate direttamente ai modelli.

Anche se questo sembra orribile da raggiungere in delphi, il primo passo consiste nell'applicare una separazione di preoccupazioni.

È possibile utilizzare un approccio MVVM e disporre di modelli di visualizzazione intermedia che eseguono la trasformazione localizzata dei valori del database per la visualizzazione. Questi stessi modelli di vista possono trasformare l'input localizzato nel fuso orario che il database si aspetta quando memorizza i dati.

MVP o qualche altra variante MV * potrebbero essere più adatti a seconda di come sei impostato e dei tuoi requisiti esatti, ma ottieni l'immagine. L'aspetto positivo di tutto questo lavoro è che i futuri cambiamenti localizzati saranno molto, molto più facili da realizzare.

    
risposta data 30.12.2014 - 17:36
fonte

Leggi altre domande sui tag