Question

Nous venons d'emménager dans un nouveau serveur et l'être tout va bien. Cependant plus tôt, je suis tombé sur une erreur de .NET quand il a essayé de convertir une chaîne dans le format « jj / mm / aaaa » à une date, maintenant je l'ai changé le réglage de la culture dans le web.config local, mais nous avons besoin que ce soit mondial .

Où puis-je changer cela? Je supposais le machine.config mais je ne pouvais pas trouver les paramètres familiers sur le serveur ancien.

Ou suis-je regarderais du côté du serveur et de trouver un paramètre pour définir la culture sur la machine à être en-GB?

== == Mise à jour J'ai changé les paramètres régionaux et il ne parvient toujours malheureusement. Y at-il un paramètre global machine.config qui peut être la vissant? À l'heure actuelle, il semble utiliser invariant et à défaut avec cela.

J'utilise Windows Server 2008 avec IIS7 si c'est une aide du tout.

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

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.

Était-ce utile?

La solution 2

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

Notez que je l'avais déjà changé les ordinateurs paramètres régionaux au Royaume-Uni et qui n'a pas résolu le problème.

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

Autres conseils

Lors de la migration des serveurs, je vous recommandons d'utiliser les mêmes paramètres régionaux (Panneau de configuration) comme avant - si cela est possible. Il suffit de faire cela, vous éviter beaucoup de problèmes.

Cela pourrait ne pas être possible mais si le nouveau serveur va accueillir d'autres applications qui attendent d'autres paramètres régionaux ou si vous devez en raison qu'en raison de nouvelles politiques.

Dans tous les cas, il est recommandé de spécifier explicitement le cas échéant le format pendant toute Parse et ToString () appelle.

Il y a même une règle FxCop (et 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 comme:


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

Notez qu'il appelle DateTime.Parse passer une CultureInfo explicite (CultureInfo.CurrentCulture).

CultureInfo.CurrentCulture obtient 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écifier explicitement formatter à utiliser lors de l'analyse des chaînes dans d'autres types de données tels que DateTime, Double, etc.

Comme je l'ai dit dans ma première réponse, il y a une règle FxCop (analyse statique) pour vérifier l'absence d'un IFormatProvider passé aux méthodes qui ont reçu une instance surcharge de celui-ci: 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")))

Vous devriez préciser ce que la culture que vous souhaitez utiliser chaque fois que vous convertissez une chaîne à une date.

La culture que vous devez utiliser dépend de quelle culture les dates sont au format. Par exemple, si toutes les dates que vous l'analyse syntaxique sont formatés comme slovaque :

String s = "24. 10. 2011";

Ensuite, vous devez analyser la chaîne comme si elle était 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 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 nous amène à la question: quel format jour utilisez-vous? Vous ne devriez pas être prévalez de la configuration locale du serveur, vous devriez être décider quel format vous voulez.

//Bad
String s = d.ToString();

//Good
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka)

//s = "2011-10-24 12:00:00 පෙ.ව."

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ées à ê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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top