DateTime.AddHours提供错误的输出和日期时间格式更改

时间:2018-05-29 09:28:27

标签: c# datetime

我希望DateTime a = Convert.ToDateTime(DateTime.UtcNow.ToString("s") + "Z"); 采用以下格式。

2018-05-29T09:16:59Z

输出:

subtract

我希望距离这个时间{4}小时var result = a.AddHours(-4); 。所以我使用了这行代码:

29-05-2018 10:52:51

现在,不仅显示错误的时间,上述格式也受到干扰。

2018-05-29T05:16:59Z

预期输出:

{{1}}

2 个答案:

答案 0 :(得分:1)

要让UTCNow减去你想做的4小时:

var fourHoursAgo = DateTime.UtcNow.AddHours(-4);
Console.WriteLine("fourHoursAgo: " + fourHoursAgo.ToString("yyyy-MM-ddTHH:mm:ssK"));

这将产生如下输出:

2018-05-29T05:36:18Z

这基本上是ISO 8601格式,非常类似于DateTime.ToString(“s”),但包括时区(在这种情况下为“Z”。)

答案 1 :(得分:0)

我认为您在这里遇到的问题是不同时区之间的转换:

//Saves the time in your own timezone
DateTime a = Convert.ToDateTime(DateTime.UtcNow.ToString("s") + "Z");
var result = a.AddHours(-4);
//1h @ middle europe (berlin,...)
Console.WriteLine("Local Timezone offset: " + TimeZoneInfo.Local.BaseUtcOffset);
//not mentioned above: + 1h daylight saving time in germany

//local times
System.Console.WriteLine("local:\t\t" + a.ToString("s")); //2018-05-29T12:34:26
System.Console.WriteLine("local -4h:\t" + result.ToString("s")); //2018-05-29T08:34:26

//utc times
System.Console.WriteLine("utc:\t\t" + DateTime.UtcNow.ToString("s")); //2018-05-29T10:34:26
var utctime = TimeZoneInfo.ConvertTime(result, TimeZoneInfo.Utc);
System.Console.WriteLine("utc -4h:\t" + utctime.ToString("s")); //2018-05-29T06:34:26

如您所见,第一行保存您的日期并在当地时区ToString("s")上返回,而不是在utc时区。这很可能导致混淆,因为你有一个utc时间格式作为输入。

我来自德国并获得当地时区UTC +01:00h。

有关详细信息,请参阅this answer.