我将日期时间存储在数据库中作为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表示时间。
答案 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);
}
}