【问题标题】:UtcNow.ToLocalTime() returns UTC time instead of local time on CentOSUtcNow.ToLocalTime() 在 CentOS 上返回 UTC 时间而不是本地时间
【发布时间】:2018-07-19 10:57:44
【问题描述】:

我有一个 .NET Core 2.0 应用程序,我需要将 UTC DateTimes 转换为本地服务器时间。该软件可在 Linux (CentOS 7) 和 Windows 上运行。

在 Windows 上,代码按预期工作:DateTime.UtcNow 返回 UTC 时间,DateTime.UtcNow.ToLocalTime() 返回调整为当前服务器时间的时间。

但是,在 CentOS 上,DateTime.UtcNow.ToLocalTime() 返回相同的 UTC 时间而不是本地时间:

$"Utc: {DateTime.UtcNow}, Kind: {DateTime.UtcNow.Kind}";
$"Local: {DateTime.UtcNow.ToLocalTime()}, Kind: {DateTime.UtcNow.ToLocalTime().Kind}";

输出

"Utc: 07/19/2018 10:53:03, Kind: Utc"
"Local: 07/19/2018 10:53:03, Kind: Local"

虽然 CentOS 服务器时间应该是 UTC+3:

$ date
Thu Jul 19 13:55:14 EEST 2018

编辑:DateTime.Now 还将当前时间返回为 UTC 而不是本地时间。

【问题讨论】:

  • echo $TZenv | grep TZ 说什么? readlink -f /etc/localtime 说什么? file /etc/localtime 说什么?
  • echo $TZenv | grep TZ 不打印任何内容,readlink -f /etc/localtime 打印 /usr/share/zoneinfo/Europe/Helsinkifile /etc/localtime 打印 /etc/localtime: symbolic link to /usr/share/zoneinfo/Europe/Helsinki'。赫尔辛基是预期的 +3 时区。
  • DateTime.Now 是否产生相同的结果?
  • 另外,您正在运行哪个特定版本的 .NET Core 运行时?你试过最新的 2.1.2 吗?如果它们已经被修复,我宁愿不去寻找错误。 ;)
  • DateTime.Now 输出与UtcNow 相同的时间。我还尝试了最新的microsoft/dotnet:2.1.2-runtime docker 镜像,但问题仍然存在。

标签: c# .net datetime .net-core


【解决方案1】:

显然我应该提到我正在使用 Docker。这显然是 Docker 的一个特性——容器不共享主机的时区。我通过在docker-compose.yml 文件中定义时区解决了这个问题:

services:
  ...:
    image: ...
    environment:
      TZ: "Europe/Helsinki"

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2012-03-12
    相关资源
    最近更新 更多