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

问题描述:

我有一个日期时间作为GMT存储在数据库中。我需要这个日期作为字符串与时区偏移UTC一起格式,例如:如何将日期时间格式设置为GMT而不考虑区域设置?

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表示时间。

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

可以使用DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,以便在步骤Parse之后以UTC值结束。然后,您可以创建从DateTime价值DateTimeOffset,所以它会假设你有一个固定的格式输入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); 
    }     
}