Je reçois une ficelle.Formatxception tenter de convertir / analyser une chaîne lorsque la culture est autre que non-nous. L'intrus est que la chaîne était générée em> en appliquant le même format et la même culture que ceux utilisés pour l'analyser dans une chaîne. Dans le code ci-dessous, toutes ces versions échoueront:
const string culture = "ja-JP";
const string format = "dd MMM yyyy"; //error in orignal post included {0:}
CultureInfo info = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture);
//string toParse = String.Format(info, format, DateTime.Now); //error in original post
string toParse = DateTime.Now.ToString(format);
System.Diagnostics.Debug.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse));
try
{
DateTime output = DateTime.ParseExact(toParse, format, CultureInfo.InvariantCulture);
//DateTime output = DateTime.ParseExact(toParse, format, info);
//DateTime output = DateTime.ParseExact(toParse, format, info, DateTimeStyles.None);
//DateTime output = Convert.ToDateTime(toParse, info);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
4 Réponses :
Essayez d'utiliser un seul m lorsque l'analyse de la date. C'est ce qui est utilisé dans l'exemple de MontdayPattern pour la culture japonaise. const string format = "{0:dd M yyyy}";
Ce n'est vraiment pas le problème. L'OP tente d'utiliser la chaîne de format composite comme format de DateTime.parseexact code>, qui n'attend que le format de date.
Si vous modifiez: à p> La date est correctement analysée. p> Notez que Votre exemple vous utilisez une culture (JA-JP) pour convertir en chaîne mais une autre culture à convertir de la chaîne. Un autre problème est que string.format code> accepte une chaîne de format composite (
"ma chaîne au format - {0: dd mmm yyyy}" code>), mais
datetime.parseexact code> n'attend que le format heure de la date. P> p>
Si vous souhaitez utiliser DateTime.parseexact code> avec
cultureInfo.invarianTculture code> alors oui, tu as raison. Si vous utilisez la culture JP cependant, ce n'est pas nécessaire.
Oui, bonne prise sur la chose {0:} - Ce n'était pas le problème ultime, mais c'était une erreur dans mon script de test (maintenant fixe). J'ai également essayé d'utiliser la culture JA-JP lors de l'analyse - il y a un certain nombre d'essais là-bas. Seulement allé à invariant quand cela ne fonctionnait pas.
string text = "25 2 2009"; DateTime date = DateTime.ParseExact(text, "d M yyyy", CultureInfo.InvariantCulture);
Le modèle de format que vous passez à datetime.parseexact code> doit être juste le modèle de date, sans l'espace réservé. Et pour la culture JP, vous devez utiliser un seul
m code> car les dates sont représentées par des chiffres même lorsque
mmm code> est spécifié lors de la conversion d'une chaîne.
const string culture = "ja-JP";
const string FROM_STRING_FORMAT = "dd M yyyy";
const string TO_STRING_FORMAT = "{0:" + FROM_STRING_FORMAT + "}";
CultureInfo info = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture);
string toParse = String.Format(info, TO_STRING_FORMAT, DateTime.Now);
Console.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse));
try
{
DateTime output = DateTime.ParseExact(toParse, FROM_STRING_FORMAT, CultureInfo.InvariantCulture);
Console.WriteLine(output);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Cela ressemble à la réponse - cela fonctionne-t-il pour toutes les cultures?
Non, cela ne fonctionne pas pour anglais b>. Le japonais est un peu inhabituel où même lorsque vous avez spécifié mmm code> vous obtenez un résultat qui n'est que
m code>. Donc, le format de chaîne
mmm code> n'est pas conforme à un voyage aller-retour lorsque vous utilisez
parseexact code> avec japonais. La meilleure recommandation que je puisse vous donner est d'utiliser la surcharge
parseexact code> qui accepte plusieurs formats, comme celui-ci:
datetime.parseexact (toparse, nouvelle [] {"d m aaayy", " "}, Cultureinfo.invariantculture, dentétimestyle.none); code>
João Angelo a raison dans son poste. Le vrai problème avec votre original est que vous mettez en train de formater à la chaîne avec une culture spécifique, puis essayez de l'analyser à l'aide de la culture invariante. Les chaînes de format ne correspondent pas. Si vous utilisez les mêmes informations de culture dans le format et l'analyse, cela fonctionne.