DateTime для RFC-1123 дает неточный часовой пояс

Если я получаю дату в формате RFC-1123 объекта DateTime, он дает текущее местное время, но дает часовой пояс как GMT (что неточно).
DateTime.Now.ToString("r");
возвращает
Fri, 12 Feb 2010 16:23:03 GMT

В 4:23 дня, но мой часовой пояс UTC+10 (плюс, сейчас мы переходим на летнее время).

Теперь я могу получить "правильное" возвращаемое значение, предварительно преобразовав его в формат UTC:
DateTime.UtcNow.ToString("r");
возвращает
Fri, 12 Feb 2010 05:23:03 GMT

Однако в идеале я хотел бы получить правильный часовой пояс, который, я думаю, должен быть
Fri, 12 Feb 2010 16:23:03 +1100

Передача текущей CultureInfo ничего не меняет. Я мог бы получить смещение UTC с помощью TimeZoneInfo.Local.GetUtcOffset(...) и отформатировать строку часового пояса из этого, но удаление бита GMT и замена его кажутся неоправданно грязными.

Есть ли способ заставить его включать правильный часовой пояс?


person Jivlain    schedule 12.02.2010    source источник


Ответы (2)


Реализация .NET всегда выражает результат так, как если бы это был GMT, независимо от временного смещения фактической даты.

Используя DateTime.Now.ToString("r");, вы, по сути, говорите String.Format("ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", DateTime.Now);, что является строкой формата .NET RFC1123, как указано в MSDN - Спецификатор формата RFC1123 ("R", "r").

Чтобы получить требуемое поведение, вам, вероятно, следует использовать String.Format и заменить фиксированный раздел спецификатора «GMT» спецификатором смещения времени:

person Mark    schedule 10.06.2010

Вы можете просто сделать DateTime.UtcNow.ToString ("R"), вы все равно получите часовой пояс GMT, но тогда время будет правильно смещено.

person Dynalon    schedule 18.09.2012
comment
Это правильно, однако вы все равно должны заменить часовой пояс. Это то, что я использовал, зная, что мой сервер EST. date.ToLocalTime().ToString(R).Replace(GMT, EST) Если вы хотите изменить заголовок даты в веб-запросе, вы можете использовать это. Я использую это в dev & prod, это работает. MethodInfo priMethod = client.Headers.GetType().GetMethod(AddWithoutValidate, BindingFlags.Instance | BindingFlags.NonPublic); priMethod.Invoke(client.Headers, новый объект[] { Дата, ‹преобразование показано выше›); - person Anthony Mason; 13.12.2015