Как отформатировать дату и время по Гринвичу независимо от региональных настроек?
У меня дата и время хранятся в базе данных как GMT. Мне нужно отформатировать это время как строку вместе со смещением часового пояса в UTC, например:
DateTime date = DateTime.Parse("2012-03-15 12:49:23");
string dateAsString = date.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz");
2012-03-15T12: 49: 23,000 + 00: 00
Этот код работает на моей машине в Великобритании. Когда я изменяю свои региональные настройки на другой часовой пояс, например Перт, я получаю следующий вывод:
2012-03-15T12: 49: 23,000+08:00
Мне нужен вывод строки, чтобы всегда представлять время в GMT.
1 ответ
Это неловко. Сначала нужно разобрать его соответствующим образом, затем отформатировать соответствующим образом... проще всего пройти через DateTimeOffset
, (Я предполагаю, что вы хотите, чтобы входная строка была обработана так, как если бы она была в формате UTC? Вы не сделали этого ясно.)
Ты можешь использовать DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal
так что вы получите значение UTC после Parse
шаг. Затем вы можете создать DateTimeOffset
От этого DateTime
значение, поэтому он будет иметь смещение 0.
Предполагая, что у вас фиксированный формат ввода, я настоятельно рекомендую вам использовать DateTime.ParseExact
вместо DateTime.Parse
, тоже. (На самом деле, я бы посоветовал вам использовать Noda Time вместо этого, но это другой вопрос...)
Образец кода:
using System;
using System.Globalization;
class Test
{
static void Main()
{
var parsed = DateTime.ParseExact("2012-03-15 12:49:23",
"yyyy-MM-dd HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal);
var dtOffset = new DateTimeOffset(parsed);
var output = dtOffset.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz",
CultureInfo.InvariantCulture);
Console.WriteLine(output);
}
}