Pourquoi ne peut-DateTime.ParseExact() analyser “9/1/2009” à l'aide “M/d/yyyy”
J'ai une chaîne qui ressemble à ceci: "9/1/2009". Je veux le convertir en un objet DateTime (à l'aide de C#).
Cela fonctionne:
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
Mais je ne comprends pas pourquoi cela ne fonctionne pas:
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
Il n'y a pas de mot dans la date (comme "septembre"), et je sais que le format spécifique, donc je préfère utiliser ParseExact (et je ne vois pas pourquoi CultureInfo serait nécessaire). Mais je reçois le redoutable "la Chaîne n'a pas été reconnu comme un DateTime valide" exception.
Grâce
Un peu de suivi. Ici sont 3 approches que le travail:
DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture);
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
Et voici 3 qui ne fonctionnent pas:
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"));
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
Donc, Parse() fonctionne avec des "en-US", mais pas ParseExact... Inattendu?
- Quelle est la version de .NET vous aide? Lorsque j'exécute la deuxième ligne ci-dessus dans PowerShell v2 sur Win7, il fonctionne très bien.
- Je suis en utilisant .net 3.5 sur xp . La culture par défaut est fr-fr.
- Dans la chaîne
"M/d/yyyy"
, chaque barre oblique/
est remplacé par leculture.DateTimeFormat.DateSeparator
chaîne. Quand vous donneznull
que le format de la santé, la culture actuelle est utilisé. Maintenant, il dépend de la culture actuelle a"/"
ou une autre chaîne (comme"-"
ou"."
) comme saDateSeparator
.
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que le problème est que les barres obliques dans la chaîne de format par rapport à ceux dans les données. C'est une culture sensible à la date de caractère de séparation dans la chaîne de format, et le dernier argument étant
null
signifie "l'utilisation de la culture actuelle". Si vous soit échapper les barres obliques ("M" /" d " /"aaaa") ou vous spécifiezCultureInfo.InvariantCulture
, ce sera ok.Si quelqu'un est intéressé à la reproduction:
InvariantCulture
), donc l'option qui exprime mieux votre intention est la cité des barres obliques (celui que vous avez choisi).DateTime.ParseExact
argument est leCultureInfo
. donc, si j'écris :new CultureInfo("de-DE")
, cela signifie que j'ai savoir cette date est séparé avec.
. alors pourquoi j'ai toujours besoin d'écrire dans le format :M/d/yyyy
et pasM.d.yyyy
? n'avons-nous pas dire que je sais que la date est séparé avec.
?Je vais avoir de la difficulté à le comprendre. si je reconnais quelque chose de par sa culture, je sais exactement comment il devrait ressembler. MAIS si vous m'avez dit , que l'utilisateur a entré9@@1@@2009
alors je dirais d'amende. permet d'utiliser parseExact. mais ensuite, je n'ai pas besoin de la culture. pouvez-vous s'il vous plaît aider ?new CultureInfo("de-DE")
cela signifie que je sais exactement quels sont les séparateurs. alors, Pourquoi devrais-je utiliserM/d/yyyy
et pasM.d.yyyy
? ( Je sais déjà que/
est un séparateur de date et.
n'est pas , mais encore une fois Si je sais que la structure , il semble meanningless...[/
vs.
] )/
comme toute lecture, il faut ensuite comprendre que c' est destiné à être le séparateur de date.Je parie que votre machine est la culture n'est pas "en-US". De la documentation:
Si votre culture actuelle n'est pas "en-US", ce serait d'expliquer pourquoi cela fonctionne pour moi mais ne fonctionne pas pour vous et fonctionne lorsque vous spécifiez explicitement la culture "en-US".
Essayer
essayer cette
Bye.
Je l'ai essayé sur XP et ça ne fonctionne pas si le PC est configuré à l'International temps aaaa-mm-jj. Placez un point d'arrêt sur la ligne et avant elle est traitée de changer la date de ficelle " - "au lieu de" /" et vous trouverez fonctionne. Il ne fait aucune différence si vous avez le CultureInfo ou pas.
Semble étrange pour être en mesure de spécifier un expercted format uniquement pour avoir le séparateur ignoré.
Essayer :
Configurer dans le fichier de configuration web de
<system.web>
<globalization culture="ja-JP" uiCulture="zh-HK" />
</system.web>
par exemple: DateTime dt = DateTime.ParseExact("08/21/2013", "MM/dd/yyyy", null);
ref url : http://support.microsoft.com/kb/306162/
Ensemble de DateTimePicker propriété de Format personnalisé et
CustomFormat
prperty àM/dd/yyyy
.