Domanda

Mi sono chiesto quali siano esattamente i principi su cui funzionano le due proprietà.So che il secondo è universale e fondamentalmente non riguarda i fusi orari, ma qualcuno può spiegare in dettaglio come funzionano e quale dovrebbe essere utilizzato in quale scenario?

È stato utile?

Soluzione

DateTime.UtcNow ti dice la data e l'ora come sarebbero nel Tempo Coordinato Universale, chiamato anche fuso orario del meridiano di Greenwich, praticamente come se fossi a Londra, Inghilterra, ma non durante l'estate. DateTime.Now fornisce la data e l'ora come apparirebbero a qualcuno nella tua lingua attuale.

Consiglierei l'uso DateTime.Now ogni volta che mostri una data a un essere umano, in questo modo si sente a suo agio con il valore che vede, è qualcosa che può facilmente confrontare con ciò che vede sul suo orologio.Utilizzo DateTime.UtcNow quando desideri memorizzare le date o utilizzarle per calcoli successivi in ​​questo modo (in un modello client-server) i tuoi calcoli non vengono confusi dai client in fusi orari diversi dal tuo server o tra loro.

Altri suggerimenti

È davvero abbastanza semplice, quindi penso che dipenda da qual è il tuo pubblico e da dove vive.

Se non usi Utc, tu dovere conosci il fuso orario della persona a cui stai visualizzando date e orari, altrimenti dirai loro che qualcosa è successo alle 15:00 nell'ora del sistema o del server, quando in realtà è successo alle 17:00 nel luogo in cui vivono.

Noi usiamo DateTime.UtcNow perché abbiamo un pubblico web globale e perché preferirei non tormentare ogni utente affinché compili un modulo che indichi il fuso orario in cui vive.

Mostriamo anche gli orari relativi (2 ore fa, 1 giorno fa, ecc.) finché il post non invecchia abbastanza da far sì che l'ora sia "la stessa", indipendentemente da dove vivi sulla Terra.

Nota anche la differenza di prestazioni;DateTime.UtcNow è circa 30 volte più veloce di DateTime.Now, perché internamente DateTime.Now sta apportando molte modifiche al fuso orario (puoi verificarlo facilmente con Reflector).

Quindi non utilizzare DateTime.Now per misurazioni del tempo relativo.

Uno dei concetti principali da comprendere in .NET è questo Ora È Ora in tutta la terra, indipendentemente dal fuso orario in cui ti trovi.Quindi se carichi una variabile con DateTime.Now O DateTime.UtcNow -- l'assegnazione è identica.* Your DateTime object sa in quale fuso orario ti trovi e ne tiene conto indipendentemente dall'assegnazione.

L'utilità di DateTime.UtcNow è utile quando si calcolano le date oltre i confini dell'ora legale.Cioè, nei luoghi che adottano l'ora legale, a volte ci sono 25 ore da mezzogiorno a mezzogiorno del giorno successivo, e talvolta ci sono 23 ore tra mezzogiorno e mezzogiorno del giorno successivo.Se vuoi determinare correttamente il numero di ore dall'ora A all'ora B, devi prima tradurle ciascuna nei loro equivalenti UTC prima di calcolare il tempo TimeSpan.

Questo è coperto da a post sul blog che ho scritto questo spiega ulteriormente TimeSpan, e include un collegamento a un articolo MS ancora più ampio sull'argomento.

*Una precisazione:Entrambe le assegnazioni memorizzeranno l'ora corrente.Se dovessi caricare due variabili una tramite DateTime.Now() e l'altro via DateTime.UtcNow() IL TimeSpan la differenza tra i due sarebbe di millisecondi, non di ore, supponendo che ti trovi in ​​un fuso orario a poche ore dal GMT.Come indicato di seguito, stampando il loro file String i valori mostrerebbero stringhe diverse.

Questa è una buona domandaLo sto rianimando per fornire qualche dettaglio in più su come si comporta .Net con differenti Kind valori.Come sottolinea @Jan Zich, in realtà è una proprietà di fondamentale importanza ed è impostata in modo diverso a seconda che la utilizzi Now O UtcNow.

Internamente la data viene memorizzata come Ticks che (contrariamente alla risposta di @Carl Camera) è diverso a seconda se lo si utilizza Now O UtcNow.

DateTime.UtcNow si comporta come le altre lingue.Tramonta Ticks a un valore basato su GMT.Inoltre tramonta Kind A Utc.

DateTime.Now altera il Ticks valore a cosa sarebbe se fosse la tua ora del giorno nel fuso orario GMT.Inoltre tramonta Kind A Local.

Se sei indietro di 6 ore (GMT-6), riceverai l'ora GMT di 6 ore fa..Net in realtà ignora Kind e tratta questo momento come se fosse successo 6 ore fa, anche se dovrebbe essere "adesso".Questo si rompe ancora di più se crei un file DateTime esempio, quindi cambia il fuso orario e prova a usarlo.

Le istanze DateTime con valori "Kind" diversi NON sono compatibili.

Diamo un'occhiata ad un po' di codice...

    DateTime utc = DateTime.UtcNow;
    DateTime now = DateTime.Now;
    Debug.Log (utc + " " + utc.Kind);  // 05/20/2015 17:19:27 Utc
    Debug.Log (now + " " + now.Kind);  // 05/20/2015 10:19:27 Local

    Debug.Log (utc.Ticks);  // 635677391678617830
    Debug.Log (now.Ticks);  // 635677139678617840

    now = now.AddHours(1);
    TimeSpan diff = utc - now;
    Debug.Log (diff);  // 05:59:59.9999990

    Debug.Log (utc <  now);  // false
    Debug.Log (utc == now);  // false
    Debug.Log (utc >  now);  // true

    Debug.Log (utc.ToUniversalTime() <  now.ToUniversalTime());  // true
    Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() >  now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() -  now.ToUniversalTime());  // -01:00:00.0000010

Come puoi vedere qui, i confronti e le funzioni matematiche non vengono convertiti automaticamente in orari compatibili.IL Timespan avrebbe dovuto essere quasi un'ora e invece erano quasi le 6."utc < now" avrebbe dovuto essere vero (ho anche aggiunto un'ora per essere sicuro), ma era comunque falso.

Puoi anche vedere la "soluzione alternativa" che consiste nel convertire semplicemente l'ora universale in qualsiasi luogo Kind non è lo stesso.

La mia risposta diretta alla domanda concorda con la raccomandazione della risposta accettata su quando utilizzarli ciascuno.Dovresti sempre Tentativo lavorare con DateTime oggetti che hanno Kind=Utc, tranne durante l'i/o (visualizzazione e analisi).Ciò significa che dovresti usarlo quasi sempre DateTime.UtcNow, ad eccezione dei casi in cui stai creando l'oggetto solo per visualizzarlo e scartarlo immediatamente.

DateTime non ha idea di cosa siano i fusi orari.Si presuppone sempre che tu sia nella tua ora locale. UtcNow significa solo "Sottrai il mio fuso orario dall'ora".

Se desideri utilizzare date basate sul fuso orario, utilizza DateTimeOffset, che rappresenta una data/ora con un fuso orario.Ho dovuto impararlo nel modo più duro.

Solo una piccola aggiunta ai punti sopra espressi:la struttura DateTime contiene anche un campo poco conosciuto chiamato Tipo (almeno, non lo sapevo da molto tempo).Fondamentalmente è solo un flag che indica se l'ora è locale o UTC;non specifica l'offset reale dall'UTC per le ore locali.Oltre al fatto che indica con quali intenzioni è stata costruita la struttura, influenza anche il modo in cui vengono utilizzati i metodi All'ora universale() E AOraLocale() lavoro.

La risposta "semplice" alla domanda è:

DateTime.Now restituisce a Appuntamento valore che rappresenta l'ora corrente del sistema (in qualunque fuso orario sia in esecuzione il sistema).IL DateTime.Kind la proprietà sarà DateTimeKind.Local

DateTime.UtcNow restituisce a Appuntamento valore che rappresenta l'attuale tempo coordinato universale (noto anche come UTC) che sarà lo stesso indipendentemente dal fuso orario del sistema.IL DateTime.Kind la proprietà sarà DateTimeKind.Utc

DateTime.UtcNow è una scala temporale continua a valore singolo, mentre DateTime.Now non è continua o a valore singolo.Il motivo principale è l'ora legale, che non si applica all'UTC.Pertanto l'UTC non salta mai avanti o indietro di un'ora, a differenza dell'ora locale (DateTime.Now).E quando salta indietro, lo stesso valore temporale si verifica due volte.

DateTime.UtcNow è una scala temporale universale che omette l'ora legale.Quindi l'UTC non cambia mai a causa dell'ora legale.

Tuttavia, DateTime.Now non è continuo o a valore singolo perché cambia in base all'ora legale.Ciò significa DateTime. Ora, lo stesso valore temporale può verificarsi due volte lasciando i clienti in uno stato confuso.

Quando hai bisogno di un'ora locale per la macchina su cui viene eseguita l'applicazione (come CEST per l'Europa), utilizza Now.Se vuoi un tempo universale - UtcNow.È solo questione delle tue preferenze, probabilmente creando un sito Web locale/un'applicazione autonoma che vorresti utilizzare nel tempo a disposizione dell'utente, quindi influenzato dalla sua impostazione del fuso orario - DateTime.Now.

Ricorda, per un sito web è l'impostazione del fuso orario del server.Pertanto, se stai visualizzando l'ora per l'utente, ottieni il suo fuso orario preferito e sposta l'ora (basta salvare l'ora Utc nel database e quindi modificarla) o specificare che è UTC.Se ti dimentichi di farlo, l'utente può vedere qualcosa come: pubblicato 3 aspetti negativi fa e poi un momento nel futuro vicino :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top