2009-09-30 16 views
0

Nous venons de passer à un nouveau serveur et tout se passe bien. Cependant, plus tôt, j'ai rencontré une erreur .NET quand il essayait de convertir une chaîne au format "jj/mm/aaaa" en une date, maintenant j'ai changé le paramètre de culture dans le web.config local, mais nous avons besoin que cela soit global .Culture globale .NET sur un nouveau serveur

Où puis-je changer cela? J'ai assumé le fichier machine.config mais je n'ai pas trouvé de paramètres familiers sur le serveur plus ancien.

Ou suis-je en train de regarder le côté serveur et de trouver un réglage pour définir la culture sur la machine à en-GB?

== UPDATE == J'ai modifié les paramètres régionaux et il échoue toujours malheureusement. Y a-t-il un paramètre global machine.config qui peut être en train de se détraquer? À l'heure actuelle, il semble utiliser invariant et échouer avec ça. J'utilise Windows Server 2008 avec IIS7 si cela peut vous aider du tout.

La chaîne utilisée est codée en dur dans la page car il s'agit d'une date de clôture pour un formulaire d'enregistrement pour un site unique.

Le code étant RAN est la suivante:

if (DateTime.Now > Convert.ToDateTime("26/04/2008 12:00")) 

Très simple et a travaillé un million de fois avant maintenant, il est seulement sur cette nouvelle configuration que cette erreur se produit.

+0

Avez-vous modifié les paramètres régionaux en en-GB ou en-US? –

+0

Tout a été défini au Royaume-Uni dans le panneau de configuration Options régionales et linguistiques. –

+0

D'où tenez-vous cette date? Est-il persisté dans le disque ou ailleurs? Est-il généré dans le même processus ou thread? Est-il généré par un autre programme? Merci de nous donner plus d'informations sur le scénario d'application. –

Répondre

1

En fin de compte (et je ne suis pas sûr que ce soit la meilleure façon de le faire ou non) je devais choisir l'ordinateur à partir de IIS7 et définir les paramètres de globalisation là en-GB. Cela a permis de résoudre le problème et de conserver tous mes autres sites Web à l'avenir dans cette culture, sauf indication contraire.

Notez que j'avais déjà modifié les paramètres régionaux d'ordinateurs au Royaume-Uni et que cela n'avait pas résolu le problème.

Je vais cependant maintenant aller de l'avant avec la suggestion d'Alfred de spécifier la culture pour analyser la date comme.

+0

Cette route a fonctionné pour moi, en changeant les paramètres régionaux pour la machine a nécessité un redémarrage. – CountZero

+0

Je l'ai fait aussi, je suis sûr que j'ai raté quelque chose que je ne peux pas savoir ce que c'est. –

2

Lors de la migration de serveurs, je vous recommande d'utiliser les mêmes paramètres régionaux (Panneau de configuration) que précédemment - si cela est possible. Juste en faisant cela, vous évitez beaucoup de problèmes.

Cela peut ne pas être possible si le nouveau serveur doit héberger d'autres applications qui attendent d'autres paramètres régionaux ou si cela est dû à de nouvelles stratégies.

Dans tous les cas, il est recommandé de spécifier explicitement le format applicable lors de tous les appels Parse et ToString().

Il existe même une règle FxCop (et une analyse statique) pour cela.


Mise à jour pour refléter de nouvelles informations sur la question:

Convert.ToDateTime est une méthode de "commodité" est mis en œuvre:


public static DateTime ToDateTime(string value) 
{ 
    if (value == null) 
    { 
     return new DateTime(0L); 
    } 
    return DateTime.Parse(value, CultureInfo.CurrentCulture); 
} 

Notez qu'il appelle le passage DateTime.Parse un CultureInfo explicite (CultureInfo.CurrentCulture).

CultureInfo.CurrentCulture récupère la valeur de Thread.CurrentThread.CurrentCulture.

Vous pouvez jeter un oeil à CultureInfo.CurrentCulture pour voir ce cultureInfo il est en fait de retour et/ou étudier plus avant d'essayer de comprendre ce qui se passe, mais d'autre part, il est recommandé que vous spécifiez explicitement la formatter à utiliser lors de l'analyse de chaînes dans d'autres types de données tels que DateTime, Double, etc.Comme je l'ai dit dans ma réponse originale, il existe une règle FxCop (analyse statique) pour vérifier l'absence d'un IFormatProvider passé aux méthodes qui ont des surcharges en recevant une instance: CA1305.

Je vous recommande de réécrire quelque chose de code le long des lignes:


if (DateTime.Now > DateTime.Parse("26/04/2008 12:00", new CultureInfo("en-GB"))) 
+0

J'ai changé les paramètres régionaux et il échoue toujours malheureusement. Y a-t-il un paramètre global machine.config qui peut être en train de visser? À l'heure actuelle, il semble utiliser invariant. –

+0

J'apprécie les informations supplémentaires et je vais certainement prendre à bord à l'avenir. Cependant, il n'a pas vraiment résolu mon problème car j'ai environ 30 sites Web qui auraient besoin d'être mis à jour et pas le temps de le faire. –

+0

J'ai voté en reconnaissance de la bonne réponse. –

0

Vous devez spécifier la culture que vous souhaitez utiliser lorsque vous convertissez une chaîne en date.

La culture que vous devriez utiliser dépend de la culture dans laquelle les dates sont formatées. Par exemple, si toutes les dates que vous l'analyse syntaxique sont au format slovaque:

String s = "24. 10. 2011"; 

Ensuite, vous devez analyser la chaîne comme si elle était en slovaque (Slovaquie) (sk-SK) culture:

//Bad: 
d = DateTime.Parse(s); 

//Good: 
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia) 

Si vos dates sont en tadjik (Tadjikistan cyrillique), alors vous devez analyser comme tg-Cryl-Tj:

String s = "24.10.11" 

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj")); 

Ce qui conduit à la question: quel format de date utilisez-vous? Vous ne devriez pas compter sur les paramètres régionaux du serveur, vous devriez décider quel format vous voulez. Je soupçonne que vous préférez tout faire en anglais.Mais alors vous devez décider quelle variante de l'anglais:

  • en-IA (Anglais Inde): 24-10-2011 15:19:52
  • en-BZ (Belize Anglais): 24/10/2011 03:19:52 PM
  • en-AU (Anglais Austrailia): 24/10/2011 3:19:52 PM
  • en-NZ (Anglais Nouvelle-Zélande): 24/10/2011 3:19:52 p.m.
  • en-GB (anglais Royaume-Uni): 24/10/2011 15:19:52
  • en-ZA (Anglais Afrique du Sud): 2011/10/24 03:19:52 PM
  • en-US (Anglais Etats-Unis): 10/24/2011 3:19:52 PM

Mais si vous ne pouvez vraiment pas décider de ce que la culture à utiliser lors de la conversion des dates pour les chaînes et vice versa, et les dates ne sont jamais destinés à être montré à un utilisateur, vous pouvez utiliser la Invariant Culture:

String s = "10/24/2011" //invariant culture formatted date 

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date 

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string