2013-03-20 13 views
7

Nell'applicazione MVC C# ho usato DateTime.Now quando l'oggetto è stato creato nella mia applicazione. Dopo la distribuzione, c'era una differenza di +8 ore tra il computer locale e l'hosting. Poi l'ho cambiato in DateTime.UtcNow, ora la differenza è di -4 ore.C'è una differenza tra ora locale e server

Per esempio nel mio data del computer è 20 Mar 2013, 14:28:12, ma la data di negozi a base di dati come 20 Mar 2013, 10:28:12.

Cosa devo fare tutti gli utenti in tutti i paesi per utilizzare 1 stessa data?

Edit: il mio fuso orario è (GMT + 04: 00) Baku, il server sta seguendo PST

+4

Questo è uno per @JonSkeet, adora le domande sui tempi della data :) – mattytommo

+0

Hmm. Non essere il ragazzo che chiede se è collegato, ma: La data/ora sul server è corretta? Almeno, corrisponde a quello sulla tua scatola? – FrankieTheKneeMan

+0

ANCHE: in quale fuso orario è presente il server e in che fuso orario ci si trova? – FrankieTheKneeMan

risposta

3

Diciamo per esempio che il vostro utente è a New York (GMT-5) e il vostro server è in India (GMT + 5:30).

Quando l'utente vede un orario "locale" di 10:00 (EST), il server vedrà un orario "locale" di 7:30 pm (IST). Tuttavia, utilizzando l'UTC in entrambe le posizioni .... l'utente vedrebbe un orario UTC di 3pm e il server vedrebbe un orario UTC di 3pm.

L'utilizzo di UTC in tutti i luoghi, ma mantenendo un riferimento del fuso orario degli utenti, consente di lavorare sempre in UTC, ma di convertire i tempi nell'orario "locale" dell'utente quando si desidera visualizzarli.

Inoltre, non è possibile fare affidamento su dove un server è ospitato in modo particolare se si tratta di un server virtuale. Né puoi assumere il fuso orario in cui la società di hosting ha impostato i propri server. È preferibile codificare sempre in modo difensivo utilizzando DateTime.UtcNow quando si memorizzano le date nella banca dati.

per convertire questo tempo UTC indietro al fuso orario di un utente è necessario effettuare le seguenti operazioni:

DateTime utcTime = new DateTime(2013, 03, 25, 10, 20, 00); 
TimeZoneInfo usersTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime usersLocalTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, usersTimeZone); 
Console.WriteLine(utcTime.ToString("hh:mm:ss"); 
Console.WriteLine(usersLocalTime.ToString("hh:mm:ss"); 

FYI, è possibile trovare un elenco dei fusi orari da:

TimeZoneInfo.GetSystemTimeZones() 

Questo dovrebbe stampare:

10:20:00 
05:20:00 

Come si può vedere, è necessario conoscere il tempo gli utenti della zona.Ci sono 2 modi per conoscere il tempo degli utenti:

  1. Avere l'utente seleziona il fuso orario nelle loro preferenze
  2. utilizzare alcuni javascript per rilevare il fuso orario della loro macchina e post indietro con la forma

Vorrei suggerire la prima opzione in quanto la seconda può rendere le cose più difficili per le persone. Ad esempio, se sono di base nel Regno Unito e volano negli Stati Uniti per la settimana. Tutto cambierà zona e potrebbero non realizzarsi!

+0

Ho salvato le date come DateTime.UtcNow. Ora, DateTime.UtcNow.ToLocalTime() non funziona correttamente. –

+0

Stai cercando di riconvertire i tempi dopo essere tornati dal database? In tal caso, l'oggetto DateTime non sa quale sia l'ora locale dell'utente. Utilizzerà l'ora locale del server. Aggiornerò la mia risposta per aggiungere ulteriori dettagli su ciò che sarà necessario fare per ottenere il tempo originale indietro ... – Penfold

+0

grazie per questo, ho capito che, posso farlo solo con javascript. Per 10 giorni sul lato server digito alcuni codici come ToLocalTime() ecc. Per mostrare data/ora con l'ora locale dell'utente. Quindi, non è giusto come dici tu. grazie per questo Posso gestirlo con la globalizzazione (cultura e uiCulture)? –

2

quando stavo lavorando su un progetto usati per utenti internazionali, ci sarebbe sempre usare DateTime.UtcNow

se si tratta di un progetto locale, ovvero progettato solo per gli usi nel proprio fuso orario, allora sarà sufficiente DateTime.Now.

1

L'ora locale è l'ora del sistema. Controlla il fuso orario nel tuo sistema operativo. L'ora del server a cui si fa riferimento è in base al fuso orario nei file di configurazione del server.

Assicurarsi che il fuso orario del sistema operativo e il fuso orario del server siano simili.

+0

. Supponiamo che l'ora locale e l'ora del server siano simili, se gli utenti si trovano in altri paesi? il loro fuso orario è diverso –

+1

È possibile rilevare il fuso orario degli utenti e il tempo di visualizzazione nel proprio fuso orario locale. Supponiamo che io sia in India, l'ora locale è alle 17.00. Il server è a Ottawa, in Canada e l'ora del server è alle 07:30. L'ora memorizzata sul server sarà l'ora del server. Quando si visualizza all'utente deve essere convertito in ora locale. – Harpreet

+0

Ok, capisco. Ho cambiato tutto DateTime.UtcNow e lo convertirò prima di essere visualizzato. grazie –

Problemi correlati