2010-07-29 17 views
4

Je dessine vraiment un blanc sur celui-ci. J'ai travaillé sur la globalisation mais le DateTime semble toujours revenir à la culture de CurrentThread. Je l'ai décomposé en étapes plus petites dans l'espoir de trouver mon problème, mais ça commence à me rendre fou.Comment créer un objet DateTime qui ne soit pas dans la culture en cours

J'ai une zone de texte avec la date exprimée sous forme de chaîne:

 // the CurrentThread's culture is de-DE 
     // My test browser is also set to de-DE 
     IFormatProvider culture = new System.Globalization.CultureInfo("de-DE", 
       true); 

     // en-US culture, what I'd ultimately like to see the DateTime in 
     IFormatProvider us_culture = new System.Globalization.CultureInfo("en-US", 
       true); 

     // correctly reads the textbox value (22.7.2010 into a datetime) 
     DateTime dt= DateTime.Parse(txtStartDate.Text, culture, 
       System.Globalization.DateTimeStyles.NoCurrentDateDefault); 

     // correctly produces a string 7/22/2010 
     string dt2 = dt.ToString(us_culture); 

À ce stade, je veux un DateTime qui est en en-US J'ai essayé à la fois:

 DateTime dt3 = Convert.ToDateTime(dt2, us_culture); 
     DateTime dt3 = DateTime.Parse(dt2, us_culture); 

Mais les deux produisent des DE DateTimes. Ma motivation à poser cette question est que le reste de la logique métier va appeler dt2.toString() et entraînera une chaîne de date incorrecte. Je me rends compte que je pourrais changer toString() pour être toString (us_culture) mais je préfère ne pas changer tout le reste de la logique métier pour accommoder ce changement.

Existe-t-il un moyen d'obtenir un DateTime dans une culture autre que la culture de CurrentThread?

Merci pour votre temps, je me suis cogné la tête contre cela pendant trop longtemps.

+1

Je ne comprends pas complètement. Voulez-vous une valeur DateTime différente, ou la chaîne retourne-t-elle de façon incorrecte (excuse si je suis juste dense). Un DateTime est un DateTime indépendamment de la culture. La seule chose qui changerait est la représentation de chaîne. – AllenG

Répondre

4

Un objet DateTime est juste cela - une date/heure, c'est agnostique de la culture. Vous devrez formater les dates en utilisant une culture spécifique si c'est ce que vous recherchez.

+0

Merci pour votre réponse. Vous avez raison, je pense que ma question elle-même était quelque peu confuse. J'essaie de corriger la mise en forme sur un appel toString(), donc j'ai vraiment besoin de réfléchir plus sur mon problème là-bas. – Dio

+0

Mon plaisir. Si vous utilisez .Net 3.0+, vous pouvez créer une "méthode d'extension" sur les lignes de DateTime.toAmericanString() qui vous évitera d'avoir à encombrer votre code avec des chaînes de format. –

1

essayez d'utiliser le format de données personnalisées:

string dt2 = dt.ToString("m/d/yyyy"); 
2

Le paramètre moins de surcharge ToString() sera toujours la date de sortie en fonction du réglage CurrentCulture. C'est ce que vous voulez 99 fois 100.

Si vous ne voulez pas utiliser la surcharge, vous pouvez définir manuellement CurrentThread.CurrentCulture comme vous le souhaitez. Mais sachez que cela va changer pour tout dans votre application.

+0

"... pour tout ** dans ce fil ** dans votre application ..." –

+0

@Lasse: Mon mauvais. Tu as tout à fait raison. –

+0

Oui, plus j'y pense, plus je me rends compte que ma question était confuse. Vous avez raison, je pense que je dois juste modifier tous mes appels toString(). Peut-être que je pourrais simplement mettre le CurrentCulture avant la section de la logique métier, puis le restaurer au retour? Je me demande si je suis dans un monde de douleur si je fais ce chemin, mais je pourrais essayer. Merci pour votre contribution. – Dio