Qu'est-ce qui ne va pas avec DateTime?Parse (myString)?

j'ai été la navigation Scott, Hanselman Interview des Développeurs question de liste, et couru à travers cette question:

Quel est le problème avec DateTime.Parse (myString)?

bien que je sache qu'il y a des risques inhérents à l'analyse d'une chaîne de format ou d'origine inconnue, y a-t-il d'autres raisons? Est-ce à utiliser DateTime.ParseExact à la place? Si ça devait être myString.ToString() en premier?

23
demandé sur casademora 2008-10-02 17:44:16

8 réponses

En outre, les paramètres régionaux de problème, DateTime.Parse() pourrait également jeter une exception que vous auriez alors à attraper. Utilisez DateTime.TryParse() ou DateTime.TryParseExact() à la place.

27
répondu Joel Coehoorn 2013-06-13 06:20:55

utiliser la culture de thread actuelle sur le système est souvent une mauvaise idée, comme est "essayer une variété de formats, et voir si l'un d'eux fonctionne."

ParseExact avec une culture spécifique est beaucoup plus contrôlé et précis approche. (Même si vous spécifiez la culture actuelle, cela rend plus évident pour les lecteurs que c'est ce qui se passe.)

14
répondu Jon Skeet 2008-10-02 13:47:19

comme le dit MSDN:

parce que la méthode Parse(String) essaie pour analyser la représentation de chaîne de une date et une heure en utilisant le formatage les règles de la culture actuelle, en essayant pour séparer une corde particulière en travers différentes cultures peuvent échouer ou de retour des résultats différents. Si un la date et l'heure précises seront parsed à travers différents endroits, utilisez le type DateTime.Parse(String, IFormatProvider) ou l'une des méthodes surcharges de la Méthode ParseExact et fournir un spécificateur de format.

5
répondu Torbjörn Gyllebring 2008-10-02 13:47:36

la question est juste pour voir si le développeur connaît les enjeux. Tout d'abord, vous devez utiliser TryParse parce que Parse jette une exception si elle est inégalable. En outre, il ne prend pas en compte locale donc dans un scénario web, si un utilisateur britannique types 02/10/2008, et mon serveur utilise une locale en-US, Je reçois février 10,2008 au lieu de Octobre 2, 2008.

il y a peut-être d'autres problèmes, mais ce sont les deux premiers qui viennent à l'esprit.

3
répondu Michael Brown 2008-10-02 13:49:39

en plus de l'entrée d'utilisateur inconnue, l'environnement peut être inconnu.., donc je suppose que même si vous contrôlez le format d'entrée, ce que l'analyse attend peut être différent..

1
répondu Torbjørn 2008-10-02 13:48:22

ma réaction viscérale va être que vous le frappez avec des formats/origines inconnus. Il peut y avoir d'autres raisons-par exemple, à partir de cette seule ligne, faites-nous myString est une chaîne de caractères? (Je suis en supposant qu'elle est, bien sûr.)

généralement je recommande la méthode TryParse à la place. C'est un peu plus verbeux, mais aide à prévenir les exceptions -- aussi longtemps que votre code se comporte de manière appropriée dans le cas d'une entrée invalide.

bien sûr, basé sur votre formulation de ... Je suppose que vous le saviez déjà tout ça. :)

1
répondu John Rudy 2008-10-02 13:49:42

ce post l'explique

0
répondu Stephen Wrighton 2008-10-02 13:47:00

La réponse dépend du code qui entoure DateTime.Parse(myString) et les exigences de la parse

vous avez peut-être déjà vérifié que la chaîne est un format valide basé sur un regex et vous n'êtes peut-être pas intéressant dans L'Information de Culture. Vous pouvez également savoir que les données proviennent d'un format de fichier connu avec une convention de date connue de sorte que jeter une exception peut être exactement ce qui est désiré.

Sans contexte la question est ambiguë et la vraie réponse à il doit être "cela dépend du contexte dans lequel le code est utilisé quant à ce qui ne va pas avec lui, si un

0
répondu Andy C 2011-11-01 10:52:54