Czy to z powodu jakiegoś problemu z formatem kultury?
Tak. Twój użytkownik musi znajdować się w kulturze, w której separatorem czasu jest kropka. Zarówno „:”, jak i „/” są interpretowane z uwzględnieniem kultury w niestandardowych formatach daty i godziny .
Jak mogę się upewnić, że ciąg wynikowy jest oddzielony dwukropkiem, a nie kropką?
Proponuję określić CultureInfo.InvariantCulture
:
string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
CultureInfo.InvariantCulture);
Alternatywnie, to mógłby tylko zacytować separatory czasu i daty:
string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");
... ale to da Ci „interesujące” wyniki, których prawdopodobnie nie spodziewasz się, jeśli uzyskasz użytkowników działających w kulturze, w której domyślny system kalendarza nie jest kalendarzem gregoriańskim. Na przykład weź następujący kod:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ar-SA");
Thread.CurrentThread.CurrentCulture = culture;
Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
}
}
To produkuje (18 września 2013):
11/12/1434 15:04:31.750
Domyślam się, że Twoja usługa internetowa byłaby tym zaskoczona!
Właściwie sugerowałbym nie tylko użycie niezmiennej kultury, ale także zmianę na format daty ISO-8601:
string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");
Jest to format bardziej akceptowany na całym świecie - można go również sortować, a porządek miesiąca i dnia jest oczywisty. (Natomiast 06/07/2013 można interpretować jako 7 czerwca lub 6 lipca, w zależności od kultury czytelnika).