2010-10-02 5 views
0

Cette ligne de code fonctionne sur mon ordinateur (Win7 64 bits). J'ai testé sur XP 32 bits dans une machine virtuelle. Ça fonctionne bien.Bizarre DateTime.Parse exception dans 3.5?

static bool HasExpire { get { return DateTime.Now >= DateTime.Parse("10/20/2010"); } } 

Toutefois, sur une machine cliente, il jette cette exception:

Une exception non gérée a été générée pendant l'exécution du demande Web en cours. L'information concernant l'origine et l'emplacement de l'exception peut être identifiée en utilisant la trace de pile d'exception ci-dessous.

[FormatException: String was not recognized as a valid DateTime.] 
    System.DateTimeParse.Parse(String s, 
     DateTimeFormatInfo dtfi, 
     DateTimeStyles styles) +2838082 

Pourquoi ne peut-il analyser la date sur la machine client quand il fait sur ma VM? La date est codée en dur. Je ne comprends pas comment cela peut se produire. J'ai confirmé que le client a 3,5 et si je change cette ligne pour retourner false toujours, l'application fonctionne parfaitement bien, sauf qu'il ne peut pas dire quand le procès a expiré.

Répondre

5

DateTime.Parse peut lancer de manière inattendue FormatException, car il dépend des paramètres régionaux. Depuis la page MSDN:

La mise en forme est influencée par les propriétés de l'objet DateTimeFormatInfo actuel, qui sont dérivées par défaut de l'élément Options régionales et linguistiques du Panneau de configuration.

Vous pouvez plutôt utiliser DateTime.ParseExact.

1

L'autre ordinateur essaie probablement d'analyser la date en tant que jj/mm/aaaa en raison d'une région différente. Vous devriez pouvoir l'obtenir pour analyser si vous entrez la date comme "2010-10-20"

+0

Correct c'est ce que j'ai fait et cela fonctionne sur le mien et le client. Merci. –

0

AntiDogs indique la cause exacte du problème. Mais l'utilisation de ParseExact garantit que vous connaissez le format exact et que le code client adhère à ce format.

Dans notre système différents clients en raison de la réalisation des exigences de bogue envoie à notre composant serveur des valeurs DateTime dans deux cultures différentes. Je gère en utilisant le code suivant:

private DateTime ParseWithDifferentCultures(string source) 
{ 
    DateTime result; 
    if (DateTime.TryParse(source, out result) 
     || DateTime.TryParse(source, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out result)) 
     return result; 

    thrown new FormatException("Unrecognised DateTime format."); 
} 

Ici, nous essayons d'abord d'analyser à l'aide d'informations de la culture actuelle, puis en utilisant les informations invariant de la culture. Bien sûr, ce n'est pas idéal mais cela correspond parfaitement à nos besoins.