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 и заменив его, кажется беспорядочно грязным.

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

2 ответа

Решение

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

Используя 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" спецификатора на спецификатор смещения времени:

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

Другие вопросы по тегам