8
votes

String.formatexception avec DateTime dans la culture non américaine

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);
}


0 commentaires

4 Réponses :


0
votes

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}";


1 commentaires

Ce n'est vraiment pas le problème. L'OP tente d'utiliser la chaîne de format composite comme format de DateTime.parseexact , qui n'attend que le format de date.



3
votes

Si vous modifiez: xxx

à xxx

La date est correctement analysée.

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 accepte une chaîne de format composite ( "ma chaîne au format - {0: dd mmm yyyy}" ), mais datetime.parseexact n'attend que le format heure de la date.


2 commentaires

Si vous souhaitez utiliser DateTime.parseexact avec cultureInfo.invarianTculture 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.



0
votes
string text = "25 2 2009";
DateTime date = DateTime.ParseExact(text, "d M yyyy", CultureInfo.InvariantCulture);

0 commentaires

0
votes

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);
        }


3 commentaires

Cela ressemble à la réponse - cela fonctionne-t-il pour toutes les cultures?


Non, cela ne fonctionne pas pour anglais . Le japonais est un peu inhabituel où même lorsque vous avez spécifié mmm vous obtenez un résultat qui n'est que m . Donc, le format de chaîne mmm n'est pas conforme à un voyage aller-retour lorsque vous utilisez parseexact avec japonais. La meilleure recommandation que je puisse vous donner est d'utiliser la surcharge parseexact qui accepte plusieurs formats, comme celui-ci: datetime.parseexact (toparse, nouvelle [] {"d m aaayy", " "}, Cultureinfo.invariantculture, dentétimestyle.none);


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.