如何将日期时间格式化为GMT而不考虑区域设置?

时间:2012-03-21 11:40:02

标签: c# datetime timezone

我将日期时间存储在数据库中作为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 个答案:

答案 0 :(得分:5)

这很尴尬。首先,你需要适当地解析它,然后适当地格式化...最简单的方法是通过DateTimeOffset。 (我假设您打算将输入字符串视为以UTC格式处理?您还没有明确说明。)

您可以使用DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,以便在Parse步骤后以UTC值结束。然后,您可以从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);
    }                   
}