2013-02-08 14 views
5

Devo convertire la stringa "Fri Sep 11 00:00:00 GMT+04:00 2020" in un oggetto DateTime11.09.2011.Conversione di una stringa data/ora UTC in C#

quando uso

DateTime result; 
DateTime.TryParseExact(MyString, "ddd MMM dd HH:mm:ss 'GMT'zzz yyyy", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out result); 

result è uguale a {9/10/2020 11:00:00 PM}.

Come posso modificare il codice in modo che la componente data è 11.09.2011 e non10.09.2011 (ho solo bisogno la data e non mi importa circa il tempo)?

risposta

6

Analizzare in uno DateTimeOffset invece, dato che hai uno uno scostamento. Dal documentation of the zz specifier che si sta utilizzando:

Con valori DateTime, il "zz" formato personalizzato identificatore rappresenta il firmato scostamento del fuso orario del sistema operativo locale da UTC, misurato in ore. Non riflette il valore della proprietà DateTimeKind di un'istanza. Per questo motivo, l'identificatore di formato "zz" non è raccomandato per l'uso con i valori DateTime.

Così ci si finisce con:

DateTimeOffset result; 
bool success = DateTimeOffset.TryParseExact 
     (text, "ddd MMM dd HH:mm:ss 'GMT'zzz yyyy", 
      CultureInfo.InvariantCulture, DateTimeStyles.None, out result); 

Da lì, si può prendere la parte DateTime, che sarà mezzanotte del 11 settembre.

Se volete solo una data, è possibile utilizzare il mio progetto Noda Time per creare un LocalDate:

LocalDate = OffsetDateTime.FromDateTimeOffset(result).LocalDateTime.Date; 

(supporto mi piacerebbe suggerire l'analisi direttamente a OffsetDateTime, ma non ce l'ho speriamo di includerlo nella versione 1.2)

4

C# non ha un tipo puro Date.
Se non ti interessa il tempo, ignora quella porzione di DateTime.

Se si desidera che sia sempre mezzanotte, utilizzare la proprietà .Date, che restituirà un DateTime con la stessa data ma a mezzanotte.

+0

Il problema è che ricevo "10.09.2011" (sbagliato) anziché "11.09.2011" (corretto). I. e. Ho bisogno di un suggerimento su come modificare il codice in modo che 'result' sia uguale a' 11.09.2011 ... '(dove ... è il momento, che per me è irrilevante). –