значение 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", что вызывает проблемы в моем веб-сервиса.

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

6 108

6 ответов:

это потому, что некоторые проблемы формата культуры?

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

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

Я бы предложил указать 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 июля в зависимости от культуры читателя.)

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

использовать \ чтобы избежать этого:

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

или использовать CultureInfo.InvariantCulture:

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

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

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

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

я столкнулся с этой проблемой в последнее время с 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 и ДХ.мм. СС в Windows 10!

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

вы можете использовать string.Формат:

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"

Преобразовать Дату В Строку

использовать пространство имен

using System.Globalization;

код

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