У меня есть приложение WP8, которое отправляет текущее время в веб-службу.
Я получаю строку даты и времени, вызывая
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")
Для большинства пользователей он отлично работает и дает мне правильную строку, например "09/10/2013 04:04:31.415"
. Но для некоторых пользователей полученная строка выглядит примерно так "09/14/2013 07.20.31.371"
, что вызывает проблемы в моем веб-сервисе.
Это потому, что проблема с культурным форматом? Как я могу убедиться, что строка результата разделена двоеточием вместо точки?
c#
windows-phone-8
Eldorado
источник
источник
Ответы:
Да. Ваш пользователь должен принадлежать к культуре, где разделителем времени является точка. И «:», и «/» интерпретируются с учетом языка и региональных параметров в настраиваемых форматах даты и времени .
Предлагаю уточнить
CultureInfo.InvariantCulture
:В качестве альтернативы вы можете просто указать разделители времени и даты:
... но это даст вам «интересные» результаты, которых вы, вероятно, не ожидаете, если вы заставите пользователей работать в культуре, где календарная система по умолчанию не является григорианским календарем. Например, возьмите следующий код:
Это дает результат (18 сентября 2013 г.):
Полагаю, ваш веб-сервис будет этим удивлен!
На самом деле я бы предложил не только использовать инвариантную культуру, но и перейти на формат даты ISO-8601:
Это более распространенный во всем мире формат - он также сортируется и делает очевидным порядок месяца и дня. (В то время как 06.07.2013 можно интерпретировать как 7 июня или 6 июля в зависимости от культуры читателя.)
источник
useUserOverride
параметра значение false, в противном случае некоторые пользовательские настройки могут переопределить настройки культуры. Например в вашем случае предлагаю использовать новыйCultureInfo("ar-SA", false)
.:
имеет особое значение: это разделитель времени. ( Строки настраиваемого формата даты и времени ).Используйте,
\
чтобы избежать этого:Или используйте
CultureInfo.InvariantCulture
:Я бы посоветовал использовать второй, потому что он
/
тоже имеет особое значение (это разделитель даты ), так что у вас могут быть проблемы и с этим.источник
Вы можете использовать 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.Format:
источник
Преобразовать дату в строку
Использовать пространство имен
Код
источник