2015-02-18 28 views
5

Próbuję uzyskać lokalną datetime w odniesieniu do luki czasu UTC i jestem wykonywania tego kodu poniżej.Wystąpił DateTimeInvalidLocalFormat

var dtString =DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fzzz"); 

ale za każdym razem zwróci mi wyjątek jako

enter image description here

Dlaczego ten wyjątek ma, jak się to naprawić?

+2

Szukały na https://msdn.microsoft.com/library/ms172213? –

+1

To nie jest wyjątek, to tylko ostrzeżenie debuggera. Naciśnij klawisz F5, aby kontynuować.Jeśli nie chcesz go zobaczyć, użyj opcji Debug> Exceptions> Managed Debugging Assistants> odznacz opcję DateTimeInvalidLocalFormat. Trochę się martwić o wygenerowanie nonsensownego ciągu, data UTC oczywiście nie ma przesunięcia UTC. –

+0

Dzięki @HansPassant, rozumiem. Głupia ja nie myślała o randce i offsecie UTC. – vijayp

Odpowiedz

5

Specyfikator formatu z służy do wyświetlania przesunięcia między czasem lokalnym a czasem UTC.

Nie ma sensu używać go z czasem UTC (ponieważ zawsze jest 0). Dlatego otrzymujesz ostrzeżenie (dzięki @HansPassant za tę uwagę).

Można:

Chcesz wydrukować czasu lokalnego i przesunięcie do UTC (który jest standardem):

var dtString = DateTime.Now.ToString(@"yyyy-MM-ddTHH\:mm\:ss.f zzz"); 

Albo chcesz wydrukować czas UTC i czas lokalny strefa (co jest NAPRAWDĘ nie wspólnych):

var dtString = DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.f") + " " + DateTime.Now.ToString(@"zzz"); 

która jest bardziej lub mniej equ ivalent do kodu (jak wyjaśniono w @JeroenMostert link):

var dtString = DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fzzz"); 

Ale wynikowy ciąg jest nie norma w ogóle i prowadzić do błędnej interpretacji.

"2015-02-18T12:08:15.1 +01:00" 

jest odczytywany jako czasu lokalnego i lokalnej strefy czasowej nie czas UTC i strefy czasu lokalnego.

Ponadto można znaleźć więcej informacji na temat strefy czasowej i dobrych przykładów tutaj: TimeZone.CurrentTimeZone Property

-1

Pełen tekst komunikatu będzie prawdopodobnie zawierał odpowiedź na pytanie:

może się to zdarzyć, gdy dzwoni DateTime.ToString używając formatu „z” specyfikator, który będzie zawierać lokalną strefę czasową offset na wyjściu. W takim przypadku należy użyć specyfikatora formatu "Z", który określa czas UTC w formacie lub użyć ciągu formatu "o", który jest zalecany jako , aby utrwalić tekst DateTime.

Twój ciąg formatu zawiera z specyfikator "yyyy-MM-ddTHH\:mm\:ss.fzzz". Spróbuj zmienić go na "yyyy-MM-ddTHH\:mm\:ss.fZZZ".

+3

To po prostu da "ZZZ" w ciągu znaków. Wiadomość jest nieco myląca; "Z" nie jest tak naprawdę specyfikatorem formatu, ale pojedynczy "Z" na końcu (który jest przekazywany niezmieniony) wyznacza czas UTC. –