Как отформатировать дату и время по Гринвичу независимо от региональных настроек?

У меня дата и время хранятся в базе данных как 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);
    }                   
}
Другие вопросы по тегам