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

use*_*225 0 c# timezone datetime

我有一个日期时间存储在数据库中作为GMT.我需要将此日期时间格式化为字符串以及UTC的时区偏移量,例如:

DateTime date = DateTime.Parse("2012-03-15 12:49:23");
string dateAsString = date.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz");
Run Code Online (Sandbox Code Playgroud)

2012-03-15T12:49:23.000 + 00:00

此代码适用于我在英国的机器.当我将区域设置更改为其他时区时,例如Perth,我得到以下输出:

2012-03-15T12:49:23.000 + 08:00

我需要字符串输出始终以GMT表示时间.

Jon*_*eet 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);
    }                   
}
Run Code Online (Sandbox Code Playgroud)