2009-10-31 2 views
3

J'ai eu une fonction rapide de formater une date, la voici:C# - Est-ce que je remplace un code parfaitement bon?

public static string archiveServerDateTime(string datetime) 
    { 
     DateTime tempDateTime = DateTime.ParseExact(datetime,"dd.MM.yyyy HH:mm:ss", null); 
     return tempDateTime.ToString("yyyy/MM/dd:HH:mm:ss"); 
    } 

seulement pour trouver la sortie de la fonction = 2009.10.22: 16: 21: 03, et étonnamment ceci est seulement sur la production 1 serveur, serveur de test fonctionnait parfaitement bien ......

Alors maintenant, je réécris la fonction à l'ancienne école de style:

public static string archiveServerDateTime(string datetime) 
    { 
     DateTime tempDateTime = DateTime.ParseExact(datetime,"dd.MM.yyyy HH:mm:ss", null); 
     string yearPart = Convert.ToString(tempDateTime.Year); 
     string monthPart = Convert.ToString(tempDateTime.Month).PadLeft(2,'0'); 
     string dayPart = Convert.ToString(tempDateTime.Day).PadLeft(2, '0'); 
     string hourPart = Convert.ToString(tempDateTime.Hour).PadLeft(2, '0'); 
     string minutePart = Convert.ToString(tempDateTime.Minute).PadLeft(2, '0'); 
     string secondPart = Convert.ToString(tempDateTime.Second).PadLeft(2,'0'); 

     return yearPart + @"/" + monthPart + @"/" + dayPart + ":" + hourPart + ":" + minutePart + ":" + secondPart; 
     //return tempDateTime.ToString("yyyy/MM/dd:HH:mm:ss"); 
    } 

Je vous demande donc mesdames et messieurs, je suis remplaçais parfaitement bon code commencer avec, ou est-ce un bug de Microsoft d'une certaine sorte? Pouvons-nous vraiment faire confiance à ces nouvelles fonctionnalités du langage qui ne semblent pas si solides, ou est-ce que je manque quelque chose?

Répondre

26

Vous devez passer DateTimeFormatInfo.InvariantInfo comme argument à la méthode DateTime.ToString. / dans la chaîne de format ne pas signifie "/" caractère tout le temps. Il décide de séparateur de date de la culture actuelle:

return tempDateTime.ToString("yyyy/MM/dd:HH:mm:ss", DateTimeFormatInfo.InvariantInfo); 

En général, il est une bonne pratique de préciser toujours clairement la culture dans ToString et Parse méthodes (non seulement sur DateTime s). FxCop (VS Code Analysis) a des règles qui crachent des avertissements lorsque vous ne le faites pas. Il est essentiel pour les cultures non américaines et l'importance est souvent sous-estimée par de nombreux programmeurs.

+1

lien de doc: http://msdn.microsoft.com/en-us/library/system.datetime.tostring(VS.71).aspx –

+0

Merci Mehrdad, aimez-vous ma vieille fonction d'école ci-dessus? –

+0

JL: Je préfère votre première fonction si c'est fait correctement. Le mode old school est plus difficile à comprendre (l'intention n'est pas évidente) et est plus sujet aux erreurs. –

4

Cela peut être un problème lié aux paramètres régionaux. Par exemple. certains pays utilisent des points comme séparateurs de date.

Éditer: C'est un problème de locale. Je viens d'essayer votre chaîne de format sur une machine avec locale allemand et il est en train de produire 2009.10.31

+0

Je suis d'accord, mais sûrement quand je dis - return tempDateTime.ToString ("aaaa/MM/jj: HH: mm: ss"); Je veux dire donnez-moi cette chaîne indépendamment de la localisation? –

+0

ToString ("aaaa/MM/jj: HH: mm: ss", System.Globalization.CultureInfo.InvariantCulture); – EricSchaefer

Questions connexes