如何将日期时间格式设置为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);
}
}