2010-04-09 7 views
3

J'utilise .NET 3.5 et j'ai une date qui vient en tant que chaîne dans le format suivant:Comment convertir la chaîne avec le format inhabituel en datetime

Mar 20 20:47:43 GMT Jan 2009

Première question, quel est le nom de ce format? Deuxième question, quel est le moyen le plus simple et le plus clair de convertir cette chaîne en date-heure? J'aimerais pouvoir utiliser une méthode .net API/Helper si possible. Editer: J'ai oublié de mentionner que j'ai déjà essayé d'utiliser DateTime.Parse et Convert.ToDateTime. Aucun de ceux qui ont travaillé.

+0

@jstawski: vous avez C# 3.0. Il n'y a pas de C# 3.5. –

+0

Oui, vous avez raison. Se est confondu avec .net 3.5 –

Répondre

11

Vous pouvez utiliser la méthode DateTime.TryParseExact() avec une chaîne de format appropriée. Voir here

EDIT: Essayez quelque chose comme ceci:

 DateTime dt; 
     System.Globalization.CultureInfo enUS = new System.Globalization.CultureInfo("en-US"); 

     if (DateTime.TryParseExact("Tue Jan 20 20:47:43 GMT 2009", "ddd MMM dd H:mm:ss \"GMT\" yyyy", enUS, System.Globalization.DateTimeStyles.NoCurrentDateDefault , out dt )) 
     { 
      Console.WriteLine(dt.ToString()); 
     } 
+1

+1: Beaucoup mieux que la réponse acceptée, car il montre comment gérer les formats de date foiré, malheureusement une occurrence assez commune. – RedFilter

+0

c'est mieux que la réponse acceptée. Je le change –

+0

lire les commentaires sur réponse posté par Atomiton –

-1
DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009") 
+0

Ne fonctionne pas, j'ai oublié de le mentionner dans la question –

+0

cela ne pas analyser – Pharabus

2
DateTime dt; 
if(DateTime.TryParse("Tue Jan 20 20:47:43 GMT 2009", out dt)){ 
    /* Yay.. it's valid */ 
} 

Vous pouvez également utiliser TryParseExact où vous pouvez spécifier le format de votre DateTime

En utilisant TryparseExact

const string FORMAT = "ddd MMM dd HH:mm:ss \"GMT\" yyyy"; 
if (DateTime.TryParseExact("Tue Jan 20 20:47:43 GMT 2009", FORMAT, CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal, out dt)) { 
     /* is valid */ 
}  

Je crois que cela devrait fonctionner. Je ne sais pas si ça va essayer d'analyser le GMT cependant.

+0

Cela ne m'aide pas. Il ne va pas analyser et il retournera faux me laissant là où j'ai commencé –

+0

édité. Avez-vous essayé de jouer avec la chaîne de format? – Armstrongest

+0

Maintenant ça marche et j'aime ça. Il ignore le GMT, savez-vous quel est le modèle pour GMT afin que nous puissions l'inclure? –

0

Vous pouvez utiliser Convert.ToDateTime

+0

wow, un moins un - soin d'élaborer? –

+0

oui, j'étais éloge, mais mon commentaire a échoué à insérer. Cela ne fonctionne pas. Lire mon édition –

0

Essayez ceci:

DateTime.TryParse(Tue Jan 20 20:47:43 GMT 2009", out objDt); 

Vous devez donner une valeur de sortie. Utilisez If et si elle renvoie true, c'est une date valide.

HTH

+0

retourne faux et je suis de retour où j'ai commencé –

0
CultureInfo enUS = new CultureInfo("en-US"); 

DateTime dt = DateTime.ParseExact("Tue Jan 20 19:47:43 GMT 2009", "ddd MMM dd HH:mm:ss 'GMT' yyyy", enUS, DateTimeStyles.None); 

Console.WriteLine(dt.ToString()); 
2

Il vous allez

DateTime d = DateTime.ParseExact("Tue Jan 20 20:47:43 GMT 2009".Replace("GMT", "+00"), "ddd MMM dd H:mm:ss zz yyyy", new CultureInfo("en-US")); 

L'API DateTime et sa documentation assez bien succions. Les exceptions vous diront seulement que "La chaîne n'a pas été reconnue comme un DateTime valide", ce qui ne vous aide pas vraiment. Il a dû déterminer les spécificateurs de format de date moi-même parce que je ne les ai pas trouvés dans MSDN. Les paramètres régionaux "en-US" sont nécessaires, je suppose, car votre format de date utilise des abréviations en anglais comme "Tue".

De toute façon, je ne peux pas vous dire quel est le format de la date. Il est assez similaire mais pas égal à un format utilisé avec HTTP (par exemple If-Modified-Since: Wed, 08 Dec 2004 13:25:25 GMT).

+0

Je devrais ajouter que je ne pouvais pas faire face à la "GMT", donc je l'ai remplacé par "+00" qui s'assure qu'au moins le fuseau horaire GMT peut être analysé correctement. – AndiDog

+0

+1 pour traiter avec GMT. –

0

Vous pouvez utiliser DateTime.ParseExact ou DateTimeOffset.ParseExact pour spécifier le format de la chaîne de date. Bien que, je n'étais pas capable de comprendre rapidement comment faire correspondre le spécificateur de fuseau horaire (c'est-à-dire GMT). Un aperçu de quelques résultats Google montre que la plupart des personnes qui tentent de résoudre ce problème le font de manière heuristique - en faisant une liste de tous les fuseaux horaires et des décalages puis en analysant la chaîne et en remplaçant le spécificateur de fuseau horaire par le décalage +/- , ou une autre sorte d'approche hackish. Bien que, aucune de ces solutions ne proviennent de StackOverflow, alors qui sait comment ils sont bons.

Voici un court exemple que j'ai écrit, avec le "GMT" dépouillé de la chaîne de date essayant d'être converti. Si vous pouvez remplacer le fuseau horaire par le décalage, ajoutez "zzz" à la chaîne de format. Pour l'analyse d'autres formats, voici la page MSDN Custom Date and Time Format Strings qui les répertorie tous.

// Parse date and time with custom specifier. 
string dateString = "Tue Jan 20 20:47:43 2009"; 
string format = "ddd MMM dd HH:mm:ss yyyy"; 
DateTime result; 
System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture; 

try 
{ 
    result = DateTime.ParseExact(dateString, format, provider); 
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
} 
catch (FormatException) 
{ 
    Console.WriteLine("{0} is not in the correct format.", dateString); 
} 
Questions connexes