Est-ce dû à un problème de format spécifique à une culture?
Oui. Votre utilisateur doit se trouver dans une culture où le séparateur d'heure est un point. Les symboles ":" et "/" sont interprétés de manière spécifique à une culture dans les formats de date et heure personnalisés.
Comment puis-je m'assurer que la chaîne de résultat est délimitée par deux points au lieu d'un point?
Je vous suggère de spécifier CultureInfo.InvariantCulture
:
string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
CultureInfo.InvariantCulture);
Alternativement, vous pouvez simplement mettre entre guillemets les séparateurs d'heure et de date:
string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");
... mais cela vous donnera des résultats "intéressants" que vous ne vous attendez probablement pas si vos utilisateurs sont dans une culture où le système de calendrier par défaut n'est pas le calendrier grégorien. Par exemple, prenons le code suivant :
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ar-SA"); // Arabie Saoudite
Thread.CurrentThread.CurrentCulture = culture;
Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
}
}
Cela produit une sortie (le 18 septembre 2013) de :
11/12/1434 15:04:31.750
Je suppose que votre service web serait surpris par cela!
Je suggère en fait non seulement d'utiliser la culture invariante, mais aussi de passer à un format de date ISO-8601 :
string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture);
C'est un format plus largement accepté - il est également triable et rend l'ordre du mois et du jour évident. (Alors que 06/07/2013 pourrait être interprété comme le 7 juin ou le 6 juillet en fonction de la culture du lecteur.)