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

我有一个日期时间存储在数据库中作为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表示时间。

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

您可以使用DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal 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); } }