Мы разрабатываем приложение на C # для клиента веб-сервиса. Это будет работать на ПК с Windows XP.
Одним из полей, возвращаемых веб-службой, является поле DateTime. Сервер возвращает поле в формате GMT, то есть с буквой «Z» в конце.
Тем не менее, мы обнаружили, что .NET, похоже, выполняет какое-то неявное преобразование, и время всегда было 12 часов.
Следующий пример кода разрешает это до некоторой степени, поскольку разница в 12 часов исчезла, но не учитывает переход на летнее время в Новой Зеландии.
CultureInfo ci = new CultureInfo("en-NZ");
string date = "Web service date".ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);
Согласно этой дате сайт :
Смещение UTC / GMT
Стандартный часовой пояс: UTC / GMT +12 часов
Летнее время: +1 час
Текущее смещение часового пояса: UTC / GMT +13 часов
Как нам отрегулировать дополнительный час? Это можно сделать программно или это какая-то настройка на ПК?
Z
время относится к UTC, а не по Гринвичу. Два могут отличаться на 0,9 секунды.Ответы:
Для таких строк, как
2012-09-19 01:27:30.000
,DateTime.Parse
не могу сказать, из какого часового пояса дата и время.DateTime
имеет свойство Kind , которое может иметь один из трех параметров часового пояса:ПРИМЕЧАНИЕ Если вы хотите указать дату / время, отличное от UTC или вашего местного часового пояса, вам следует использовать
DateTimeOffset
.Итак, для кода в вашем вопросе:
Вы говорите, что знаете, какой это, так что скажите это.
Теперь, когда система знает время в UTC, вы можете просто позвонить
ToLocalTime
:Это даст вам требуемый результат.
источник
DateTime convertedTime = new DateTime(DateTime.Parse(dateStr).Ticks), DateTimeKind.Utc);
Kind
значенияDateTime
сUnspecified
наUTC
на ненужный.Unspecified
предполагается для следующихUTC
целейToLocalTime
: msdn.microsoft.com/en-us/library/…Я хотел бы изучить использование класса System.TimeZoneInfo, если вы находитесь в .NET 3.5. См. Http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx . Это должно учитывать изменения летнего времени правильно.
источник
источник
DateTime
объекты имеютKind
поUnspecified
по умолчанию, которые для целейToLocalTime
предполагаетсяUTC
.Чтобы получить местное время
Unspecified
DateTime
объекта, вам нужно сделать следующее:Шаг изменения
Kind
значенияDateTime
сUnspecified
наUTC
на ненужный.Unspecified
предполагается для следующихUTC
целейToLocalTime
: http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspxисточник
convertedDate.FromLocalTime();
перейдем вUTC
.Я знаю, что это более старый вопрос, но я столкнулся с подобной ситуацией, и я хотел поделиться тем, что я нашел для будущих поисковиков, возможно, включая себя :).
DateTime.Parse()
может быть сложно - см. здесь, например.Если
DateTime
исходящий из веб-службы или другого источника с известным форматом, вы можете рассмотреть что-то вродеили даже лучше,
AssumeUniversal
Флаг указывает анализатору , что дата / время уже UTC; комбинацияAssumeUniversal
иAdjustToUniversal
говорит, что не следует преобразовывать результат в «местное» время, что он попытается сделать по умолчанию. (Я лично в любом случае стараюсь иметь дело исключительно с UTC на бизнес-уровне / уровне приложений / сервисов. Но обход конверсии в местное время также ускоряет процесс - на 50% и более в моих тестах, см. Ниже.)Вот что мы делали раньше:
Мы профилировали приложение и обнаружили, что DateTime.Parse представляет значительный процент использования процессора. (Между прочим,
CultureInfo
конструктор не вносил существенный вклад в использование ЦП.)Поэтому я настроил консольное приложение для разбора строки даты / времени 10000 раз различными способами. Итог:
Parse()
10 секундParseExact()
(преобразование в локальное) 20-45 мсParseExact()
(не преобразование в локальное) 10-15 мс... и да, результаты для
Parse()
приведены в секундах , в то время как остальные в миллисекундах .источник
Я просто хотел бы добавить общее предупреждение.
Если все, что вы делаете, это получаете текущее время от внутренних часов компьютера, чтобы поместить дату / время на дисплей или отчет, то все в порядке. Но если вы сохраняете информацию о дате / времени для дальнейшего использования или рассчитываете дату / время, будьте осторожны!
Допустим, вы определили, что круизный лайнер прибыл в Гонолулу 20 декабря 2007 года в 15:00 UTC. И вы хотите знать, какое местное время это было.
1. Вероятно, в этом участвуют как минимум три местных жителя. Локальный может означать Гонолулу, или это может означать, где находится ваш компьютер, или это может означать, где находится ваш клиент.
2. Если вы используете встроенные функции для преобразования, это, вероятно, будет неправильно. Это связано с тем, что летнее время (вероятно) в настоящее время действует на вашем компьютере, но НЕ действует в декабре. Но Windows не знает этого ... все, что у нее есть, это один флаг, чтобы определить, действует ли в настоящее время летнее время. И если он в настоящее время действует, то он с радостью добавит час даже к дате в декабре.
3.Переход на летнее время осуществляется по-разному (или не осуществляется вообще) в различных политических подразделениях. Не думайте, что только из-за того, что ваша страна меняется на определенную дату, другие страны тоже.
источник
источник
Не забудьте, если у вас уже есть объект DateTime и вы не уверены, является ли он UTC или локальным, достаточно просто напрямую использовать методы объекта:
Если не указано .net будет использовать локальные настройки компьютера. Я бы прочитал: http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx
По внешнему виду код может выглядеть примерно так:
И, как уже упоминалось выше, дважды проверьте настройку часового пояса на вашем сервере. В сети есть статьи о том, как безопасно повлиять на изменения в IIS.
источник
В ответ на предложение Даны:
Пример кода теперь выглядит так:
Первоначальная дата была 20/08/08; вид был UTC.
Оба «convertDate» и «dt» одинаковы:
21/08/08 10:00:26; вид был местный
источник
У меня была проблема с тем, что он находился в наборе данных, передаваемом по проводам (от веб-службы к клиенту), и он автоматически менялся, потому что поле DateType в DataColumn было установлено как локальное. Убедитесь, что вы проверили, что такое DateType, если вы продвигаете DataSets.
Если вы не хотите, чтобы это изменилось, установите значение Unspecified
источник
Я столкнулся с этим вопросом, так как у меня была проблема с датами UTC, которые вы возвращаете через твиттер API (поле made_at в статусе); Мне нужно конвертировать их в DateTime. Ни один из ответов / примеров кода в ответах на этой странице не был достаточным для того, чтобы я не получил ошибку «Строка не была распознана как действительный DateTime» (но это самый близкий способ найти правильный ответ на SO)
Размещение этой ссылки здесь на случай, если это поможет кому-то еще - нужный мне ответ был найден в этом блоге: http://www.wduffy.co.uk/blog/parsing-dates-when-aspnets-datetimeparse-doesnt-work/ - в основном используйте DateTime.ParseExact со строкой формата вместо DateTime.Parse
источник