DateTime.ToString( "MM/dd/yyyy HH: mm: ss.fff" ) привела к чему-то вроде "09/14/2013 07.20.31.371"

У меня есть приложение WP8, которое отправит текущее время на веб-службу.

Я получаю строку datetime, вызывая

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

Для большинства пользователей он отлично работает и дает мне правильную строку, например "09/10/2013 04:04:31.415". Но для некоторых пользователей приведенная строка - это что-то вроде "09/14/2013 07.20.31.371", что вызывает проблемы в моей веб-службе.

Это из-за того, что какой-то формат культуры? Как я могу убедиться, что результирующая строка разделена двоеточием вместо точки?

Ответ 1

Это связано с тем, что какой-то формат культуры?

Да. Ваш пользователь должен быть в культуре, где разделитель времени является точкой. И ":" и "/" интерпретируются чувствительным к культуре способом в пользовательских форматах даты и времени.

Как я могу убедиться, что результирующая строка разделена двоеточием вместо точки?

Я бы предложил указать CultureInfo.InvariantCulture:

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

В качестве альтернативы вы можете просто указать разделители времени и даты:

string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");

... но это даст вам "интересные" результаты, которые вы, вероятно, не ожидаете, если вы получите пользователей, работающих в культуре, где календарная система по умолчанию не является григорианским календарем. Например, введите следующий код:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()        
    {
        DateTime now = DateTime.Now;
        CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
        Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
    }
} 

Это дает результат (18 сентября 2013 г.):

11/12/1434 15:04:31.750

Я предполагаю, что ваш веб-сервис будет удивлен этим!

Я бы предложил не только использовать инвариантную культуру, но и изменить формат даты ISO-8601:

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

Это более глобально принятый формат - он также сортируется и делает месячный и дневной порядок очевидными. (Принимая во внимание, что 06/07/2013 можно интерпретировать как 7 июня или 6 июля в зависимости от культуры читателя.)

Ответ 2

: имеет особое значение: это разделитель времени. (Пользовательские строки формата даты и времени).

Используйте \, чтобы избежать этого:

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

Или используйте CultureInfo.InvariantCulture:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

Я предлагаю перейти ко второму, потому что / имеет особое значение (это разделитель дат.), поэтому у вас также могут быть проблемы с этим.

Ответ 3

Вы можете использовать InvariantCulture, потому что ваш пользователь должен быть в культуре, которая использует точку вместо двоеточия:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);

Ответ 4

Я столкнулся с этой проблемой в последнее время с Windows 10 от в другом направлении и нашел ответ от @JonSkeet очень полезным при решении моей проблемы.

Я также провел дополнительные исследования с тестовой формой и обнаружил, что когда текущая культура была установлена ​​на "no" или "nb-NO" во время выполнения (Thread.CurrentThread.CurrentCulture = new CultureInfo("no");), ToString ( "yyyy-MM-dd HH: mm: ss" ) ответили по-разному в Windows 7 и Windows 10. Он вернул то, что я ожидал в Windows 7 и HH.mm.ss в Windows 10!

Я думаю, что это немного страшно! Поскольку я считал, что культура была культурой в любой версии Windows, по крайней мере.

Ответ 5

Вы можете использовать String.Format:

DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"

Ответ 6

Преобразование даты в строку

Использовать имя Пробел

enter code here
using System.Globalization;

код

enter code here
string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");