J'ai la date et l'heure dans une chaîne formatée comme celle-ci:
"2011-03-21 13:26" //year-month-day hour:minute
Comment puis-je l'analyser System.DateTime
?
Je souhaite utiliser des fonctions comme DateTime.Parse()
ou DateTime.ParseExact()
si possible, pour pouvoir spécifier le format de la date manuellement.
Réponses:
DateTime.Parse()
essaiera de comprendre le format de la date donnée, et cela fait généralement du bon travail. Si vous pouvez garantir que les dates seront toujours dans un format donné, vous pouvez utiliserParseExact()
:(Mais notez qu'il est généralement plus sûr d'utiliser l'une des méthodes TryParse au cas où une date ne serait pas au format attendu)
Assurez-vous de vérifier les chaînes de format de date et d'heure personnalisées lors de la construction de la chaîne de format, en particulier faites attention au nombre de lettres et à la casse (c'est-à-dire que «MM» et «mm» signifient des choses très différentes).
Une autre ressource utile pour les chaînes au format C # est la mise en forme de chaînes en C #
la source
s
. Par conséquent, il est préférable d'utiliser TryParseExcact. J'ai expliqué pourquoi dans ma réponse ci-dessous.Comme je l'expliquerai plus tard, je préférerais toujours les méthodes
TryParse
etTryParseExact
. Parce qu'ils sont un peu volumineux à utiliser, j'ai écrit une méthode d'extension qui rend l'analyse beaucoup plus facile:Contrairement à
Parse
,ParseExact
etc., il ne lève pas d'exception et vous permet de vérifier viaif (dt.HasValue) { // continue processing } else { // do error handling }
si la conversion a réussi (dans ce cas,
dt
a une valeur à laquelle vous pouvez accéder viadt.Value
) ou non (dans ce cas, c'est le casnull
).Cela permet même d'utiliser des raccourcis élégants comme l'opérateur "Elvis"
?.
, par exemple:Ici, vous pouvez également utiliser
year.HasValue
pour vérifier si la conversion a réussi, et si elle n'a pas réussi,year
elle contiendranull
, sinon la partie année de la date. Aucune exception n'est levée si la conversion a échoué.Solution: la méthode d'extension .ToDate ()
Essayez-le dans .NetFiddle
Quelques informations sur le code
Vous vous demandez peut-être pourquoi j'ai utilisé l'
InvariantCulture
appelTryParseExact
: C'est pour forcer la fonction à traiter les modèles de format toujours de la même manière (sinon, par exemple, "." Pourrait être interprété comme un séparateur décimal en anglais alors qu'il s'agit d'un séparateur de groupe ou d' un séparateur de date dans Allemand). Rappelez-vous que nous avons déjà interrogé les chaînes de format basées sur la culture quelques lignes auparavant, donc ce n'est pas grave ici.Mise à jour:
.ToDate()
(sans paramètres) utilise désormais par défaut tous les modèles de date / heure courants de la culture actuelle du thread.Notez que nous avons besoin du
result
etdt
ensemble, carTryParseExact
ne permet pas d'utiliserDateTime?
, que nous avons l'intention de retourner. Dans C # version 7, vous pouvez simplifierToDate
un peu la fonction comme suit:ou, si vous l'aimez encore plus court:
auquel cas vous n'avez pas besoin des deux déclarations
DateTime? result = null;
etDateTime dt;
du tout - vous pouvez le faire en une seule ligne de code. (Il serait également permis d'écrireout DateTime dt
au lieu deout var dt
si vous préférez cela).J'ai encore simplifié le code en utilisant le
params
mot - clé: maintenant, vous n'avez plus besoin de la 2 ème méthode surchargée.Exemple d'utilisation
Comme vous pouvez le voir, cet exemple demande simplement
dt.HasValue
si la conversion a réussi ou non. En prime, TryParseExact permet de spécifier strictDateTimeStyles
afin que vous sachiez exactement si une chaîne date / heure correcte a été passée ou non.Plus d'exemples d'utilisation
La fonction surchargée vous permet de transmettre un tableau de formats valides utilisés pour analyser / convertir les dates comme indiqué ici également (
TryParseExact
prend directement en charge cela), par exempleSi vous ne disposez que de quelques modèles de modèles, vous pouvez également écrire:
Exemples avancés
Vous pouvez utiliser l'
??
opérateur pour utiliser par défaut un format de sécurité, par exempleDans ce cas, le
.ToDate()
utiliserait des formats de date de culture locaux communs, et si tout cela échouait, il essaierait d'utiliser le format standard ISO"yyyy-MM-dd HH:mm:ss"
comme solution de secours. De cette façon, la fonction d'extension permet de "chaîner" facilement différents formats de repli.Vous pouvez même utiliser l'extension dans LINQ, essayez ceci (c'est dans le .NetFiddle ci-dessus):
qui convertira les dates du tableau à la volée en utilisant les modèles et les videra dans la console.
Quelques informations sur TryParseExact
Enfin, voici quelques commentaires sur l'arrière-plan (c'est-à-dire la raison pour laquelle je l'ai écrit de cette façon):
Je préfère TryParseExact dans cette méthode d'extension, car vous évitez la gestion des exceptions - vous pouvez lire dans l'article d'Eric Lippert sur les exceptions pourquoi vous devriez utiliser TryParse plutôt que Parse, je le cite à ce sujet: 2)
Il fait, mais
TryParse
et lesTryParseExact
deux sont encore beaucoup moins confortable à utiliser: Ils vous obligent à utiliser une variable non initialisée comme unout
paramètre qui ne doit pas être annulable et si vous vous convertir besoin d'évaluer la valeur de retour booléen - soit vous avez pour utiliser uneif
instruction immédiatement ou vous devez stocker la valeur de retour dans une variable booléenne supplémentaire pour pouvoir effectuer la vérification plus tard. Et vous ne pouvez pas simplement utiliser la variable cible sans savoir si la conversion a réussi ou non.Dans la plupart des cas, vous voulez simplement savoir si la conversion a réussi ou non (et bien sûr la valeur si elle a réussi) , donc une variable cible Nullable qui conserve toutes les informations serait souhaitable et beaucoup plus élégante - car toutes les informations sont juste stocké dans un seul endroit: c'est cohérent et facile à utiliser, et beaucoup moins sujet aux erreurs.
La méthode d'extension que j'ai écrite fait exactement cela (elle vous montre également quel type de code vous devriez écrire à chaque fois si vous ne l'utilisez pas).
Je pense que l'avantage
.ToDate(strDateFormat)
est qu'il a l'air simple et propre - aussi simple que l'originalDateTime.Parse
était censé l'être - mais avec la possibilité de vérifier si la conversion a réussi, et sans jeter d'exceptions.1) Ce que l'on entend ici, c'est que la gestion des exceptions (c'est-à-dire un
try { ... } catch(Exception ex) { ...}
bloc) - qui est nécessaire lorsque vous utilisez Parse car elle lèvera une exception si une chaîne invalide est analysée - n'est pas seulement inutile dans ce cas mais aussi ennuyeuse, et compliquer votre code. TryParse évite tout cela comme le montre l'exemple de code que j'ai fourni.2) Eric Lippert est un célèbre collègue de StackOverflow et a travaillé chez Microsoft en tant que développeur principal au sein de l'équipe du compilateur C # pendant quelques années.
la source
Consultez ce lien pour d'autres chaînes de format!
la source
DateTime.Parse () devrait fonctionner correctement pour ce format de chaîne. Référence:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
Est-ce que cela lance une exception FormatException pour vous?
la source
Mettez la valeur d'une chaîne lisible par l'homme dans un DateTime .NET avec un code comme celui-ci:
la source
La réponse simple et directe ->
la source
Vous pouvez également utiliser XmlConvert.ToDateString
Il est bon de spécifier le type de date, le code est:
Plus de détails sur les différentes options d'analyse http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
la source
Essayez le code suivant
la source