значение 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 ответов:
это потому, что некоторые проблемы формата культуры?
да. Ваш пользователь должен быть в культуре, где разделитель-точка. Оба ": "и" / " интерпретируются с учетом культуры в пользовательские форматы даты и времени.
как я могу убедиться, что строка результата разделена двоеточием вместо точки?
Я бы предложил указать
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, по крайней мере.