146 votes

Comment créer un .Net DateTime à partir du format ISO 8601

J'ai trouvé comment transformer un DateTime en format ISO 8601, mais rien sur la procédure inverse en C #.

J'ai '2010-08-20T15: 00: 00Z' et je souhaite le transformer en objet DateTime.

Je pourrais séparer les parties de la chaîne moi-même, mais cela me semble beaucoup de travail pour quelque chose qui est déjà une norme internationale.

162voto

Mamta Dalal Points 3546

EDIT : La solution précédente ne fonctionnait pas avec Z donc corrigée pour montrer la bonne solution. Cette solution utilise l'énumération DateTimeStyles .

 DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z",  null, DateTimeStyles.RoundtripKind);
 

Cela imprime parfaitement la solution.

39voto

Alexey Biryukov Points 142

Bien que MSDN dit que "s" et le "o" formats de refléter la norme, ils semblent être en mesure d'analyser seulement un sous-ensemble limité de. C'est surtout un problème si la chaîne contient des spécifications zone. (Ni pour base ISO8601 formats, ou réduction de la précision des formats - cependant ce n'est pas exactement le cas.) C'est pourquoi j'utilise les chaînes de format personnalisées quand il s'agit de l'analyse ISO8601. Actuellement mon préféré extrait est:

static readonly string[] formats = { 
    // Basic formats
    "yyyyMMddTHHmmsszzz",
    "yyyyMMddTHHmmsszz",
    "yyyyMMddTHHmmssZ",
    // Extended formats
    "yyyy-MM-ddTHH:mm:sszzz",
    "yyyy-MM-ddTHH:mm:sszz",
    "yyyy-MM-ddTHH:mm:ssZ",
    // All of the above with reduced accuracy
    "yyyyMMddTHHmmzzz",
    "yyyyMMddTHHmmzz",
    "yyyyMMddTHHmmZ",
    "yyyy-MM-ddTHH:mmzzz",
    "yyyy-MM-ddTHH:mmzz",
    "yyyy-MM-ddTHH:mmZ",
    // Accuracy reduced to hours
    "yyyyMMddTHHzzz",
    "yyyyMMddTHHzz",
    "yyyyMMddTHHZ",
    "yyyy-MM-ddTHHzzz",
    "yyyy-MM-ddTHHzz",
    "yyyy-MM-ddTHHZ"
    };

public static DateTime ParseISO8601String ( string str )
{
    return DateTime.ParseExact ( str, formats, 
        CultureInfo.InvariantCulture, DateTimeStyles.None );
}

Si vous n'avez pas l'esprit d'analyse TZ-moins de cordes (je ne), vous pouvez ajouter un "s" ligne de prolonger considérablement le nombre de couverts format des altérations.

23voto

abatishchev Points 42425
using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);

20voto

Reb.Cabin Points 1390

En voici un qui fonctionne mieux pour moi (version LinqPad):

 DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00Z",
    @"yyyy-MM-dd\THH:mm:ss\Z",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, 
    out d);
d.ToString()
 

produit

 true
8/20/2010 8:00:00 AM
 

4voto

Zar Shardan Points 1305

Cela fonctionne très bien dans LINQPaq4:

 Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z"));
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00"));
Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00"));
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X