2013-07-25 12 views
9

Ho un ISO 8601 timestamp nel formato:di analisi ISO 8601 con fuso orario per datetime .NET

YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] 

YYYY-MM-DDThh:mm:ss[{+|-}hh:mm] 

Esempi:

2013-07-03T02:16:03.000+01:00 

2013-07-03T02:16:03+01:00 

Come posso analizzare in un .NET Framework DateTime con la corretta TimeZone fornito?

Il DateTime.TryParse non funziona perché le informazioni finali relative allo TimeZone.

+0

possibile duplicato di [DateTime.ParseExact , Ignora il fuso orario] (http://stackoverflow.com/questions/6676856/datetime-parseexact-ignore-the-timezone) – V4Vendetta

risposta

11

Dovresti essere in grado di formattare utilizzando DateTimeOffset e K custom format specifier. È quindi possibile convertirlo in un DateTime in seguito, se lo si desidera. Esempio di codice:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     string text = "2013-07-03T02:16:03.000+01:00"; 
     string pattern = "yyyy-MM-dd'T'HH:mm:ss.FFFK"; 
     DateTimeOffset dto = DateTimeOffset.ParseExact 
      (text, pattern, CultureInfo.InvariantCulture); 
     Console.WriteLine(dto); 
    } 
} 

Una cosa da notare è che questo è mal chiamato - in realtà non è un fuso orario, è solo compensare un'UTC. Lo non ha lo effettivamente indicato il fuso orario originale. (Ci possono essere diversi fusi orari differenti osservando lo stesso di offset allo stesso tempo.)

O con Noda Time (versione instabile, che diventerà ben presto 1.2):

string text = "2013-07-03T02:16:03.000+01:00"; 
OffsetDateTimePattern pattern = OffsetDateTimePattern.ExtendedIsoPattern; 
OffsetDateTime odt = pattern.Parse(text).Value; 
Console.WriteLine(odt);