Come convertire i dati nei valori di temporizzazione basati su UTC per confrontare i timings- c #
-
14-12-2019 - |
Domanda
Ho una stringa (variabile è fileDate
) con valori di data nel seguente formato:
.2/12/2011 11:58 AM
Ora voglio convertire questo in una data e poi a UTC Time basato come ho problemi nel confrontare le date in diverse macchine, quindi * Voglio sempre convertire tutte le stringhe (che vengono confrontate) ai valori UTC_Date. *
Ho provato questo codice qui sotto, ma non funzionava come non sono in grado di convertire la stringa sopra in base a DateTime basata (in quanto non ha secondi).
DateTime date = Convert.ToDateTime(fileDate);
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
fileDate = date.ToString("MM/dd/yyyy hh:mm tt");
.
sopra non ha funzionato mostrando Formatexception. Puoi aiutare?
Soluzione
Per iniziare, suggerirei di usare DateTime.ParseExact
o TryParseExact
: non mi è chiaro se il tuo campione è destinato a essere il 2 dicembre o il 12 febbraio. Specifica del formato potrebbe rimuovere il FormatException
.
- .
- Se è un'ora locale nel fuso orario del codice che è in esecuzione, è possibile utilizzare
DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal
per farlo come parte dell'analisi. - Se è già un tempo universale, usa
DateTimeStyles.AssumeUniversal
- Se è un'ora locale in un fuso orario diverso, dovrai usare
TimeZoneInfo
per eseguire la conversione.
Inoltre, se è un'ora locale dovrai considerare due casi d'angolo (supponendo che tu stia utilizzando un fuso orario che osserva l'ora legale):
- .
- Un'ora locale può essere saltato a causa delle transizioni DST, quando gli orologi vanno avanti. Quindi se gli orologi saltano dalle 1 del mattino alle 2 del mattino, poi 1:30 AM non esistono affatto.
- Un'ora locale può essere ambigua a causa delle transizioni DST, quando gli orologi tornano indietro. Quindi se gli orologi tornano dalle 2:00 alle 1 del mattino, quindi 1:30 AM si verifica due volte a diversi tempi UTC - quale occorrenza sei interessato a?
Dovresti decidere come si desidera gestire questi casi e assicurati che siano trattati nei tuoi test unità.
Un'altra opzione è quella di utilizzare la mia libreria data e oraria, ora noda , che separa i concetti di " Data / ora locale "e" data / ora in un particolare fuso orario "(e altri) in modo più esplicito.
Altri suggerimenti
È necessario utilizzare DateTime.ParseExact
per ottenere il valore in un'istanza corretta datetime, quindi è possibile utilizzare .ToUniversalTime()
per ottenere il tempo UTC (questo sarebbe rispetto alla differenza di tempo come nella macchina server)
Puoi usare:
DateTime.Now.ToUniversalTime();
Non intendo dire che dovresti usare "datetime.ow", ma ottieni il punto che come parte dell'oggetto DateTime hai un metodo per trasformarlo in tempo universale
http://msdn.microsoft.com/en-US / Biblioteca / System.Datetime.touniversaltime.aspx