【发布时间】:2019-02-04 10:10:57
【问题描述】:
我有一个使用 DateTime 类创建的 UTC 时间戳。
var time = DateTime.UtcNow;
当我格式化它时,我得到以下结果:
time.ToString("yyyy-MM-ddTHH:mm:sszzz")
> 2019-02-03T10:08:40+00:00
这是正确的,但我希望它在本地时区中格式化,如下所示:
2019-02-03T11:08:40+01:00
我怎样才能得到这个?
我可以在此示例中使用 DateTime.Local,但时间戳实际上来自另一个系统/模块,因此解决方案必须适用于 DateTime.UtcNow 之类的东西
【问题讨论】:
-
来自docs:“使用
DateTime值,"zzz"自定义格式说明符表示本地操作系统的时区与 UTC 的有符号偏移量,以小时和分钟。它不反映实例的DateTime.Kind属性的值”。我认为您正在执行该代码的服务器上的本地时区是已经 UTC+0。我建议再检查一次。 -
我在自己的电脑上得到这些结果,我 100% 确定时间在 +1 内。
-
只要其他系统使用时区生成时间,它是 UTC 还是任何其他时区都没有关系。任何 DateTime 都作为 UTC 时间存储在 Net 中。当您使用 PARSE 时,Net 会自动将日期时间转换为正确的值。使用 UtcNow 会给您带来问题,因为它会错误地存储时间。你真正想要的是这样的: DateTime date = DateTime.Now; Console.WriteLine(date.ToUniversalTime());
-
对于
DateTime值,您应该使用K,而不是zzz。将zzz与DateTimeOffset值一起使用。如果你想要本地,那么首先使用DateTime.Now,或者.ToLocalTime()。