2015-02-18 18 views
5

Sto cercando di ottenere il datetime locale con riferimento all'ora UTC e sto eseguendo questo codice di seguito.DateTimeInvalidLocalFormat

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

ma ogni volta che mi restituisce un'eccezione in quanto

enter image description here

Perché questa eccezione è lì, come ottenere questo riparato?

+2

Hai guardato https://msdn.microsoft.com/library/ms172213? –

+1

Non è un'eccezione, è solo un avviso di debugger. Premere F5 per continuare.Se non si desidera visualizzarlo, utilizzare Debug> Eccezioni> Assistenti debug gestiti> deselezionare l'opzione DateTimeInvalidLocalFormat. Non preoccuparti di generare una stringa senza senso, una data UTC ovviamente non ha uno scostamento UTC. –

+0

Grazie a @HansPassant, capito, stupido non ho pensato alla data e all'offset dell'UTC. – vijayp

risposta

5

L'identificatore di formato z viene utilizzato per mostrare l'offset tra ora locale e ora UTC.

Non ha senso utilizzarlo con l'ora UTC (poiché è sempre 0). Ecco perché ricevi un avvertimento (grazie a @HansPassant per questa osservazione).

È possibile:

desidera stampare l'ora locale e l'offset per l'UTC (che è standard):

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

O consiglia di stampare l'ora UTC e l'ora locale zona (che è davvero non comune):

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

che è più o meno equ ivalent al codice (come spiegato nel @JeroenMostert link):

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

Ma la stringa risultante è non è standard a tutti e portare a interpretazioni errate.

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

viene letto come ora locale e fuso orario locale non ora UTC e fuso orario locale.

Inoltre è possibile trovare ulteriori informazioni su fuso orario e buoni esempi qui: TimeZone.CurrentTimeZone Property

-1

Il testo integrale messaggio sarà probabilmente rispondere alla tua domanda:

Questo può accadere quando si chiama DateTime.ToString utilizzando il formato 'z' identificatore, che comprenderà una differenza di fuso orario in uscita di zona locale. In questo caso, utilizzare l'identificatore di formato 'Z', che indica un'ora UTC o utilizzare la stringa di formato 'o', che è il metodo consigliato per per mantenere un DateTime nel testo.

La stringa di formato contiene l'identificatore z"yyyy-MM-ddTHH\:mm\:ss.fzzz". Prova a cambiarlo in "yyyy-MM-ddTHH\:mm\:ss.fZZZ".

+3

Ciò produrrà solo "ZZZ" nella stringa. Il messaggio è leggermente fuorviante; "Z" non è realmente un identificatore di formato, ma una singola "Z" alla fine (che viene passata invariata) indica un tempo UTC. –