UtcNow.ToLocalTime()在CentOS上返回的是UTC时间而不是本地时间

3
我有一个.NET Core 2.0应用程序,需要将UTC的DateTime转换为本地服务器时间。这个软件同时在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输出什么? - omajid
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时区的赫尔辛基。 - Koja
DateTime.Now 会产生相同的结果吗? - Matt Johnson-Pint
另外,您正在运行哪个特定版本的.NET Core Runtime?您是否尝试过最新的2.1.2版本?如果已经修复了错误,我宁愿不去寻找错误。 ;) - Matt Johnson-Pint
DateTime.Now 输出的时间与 UtcNow 相同。我还尝试使用最新的 microsoft/dotnet:2.1.2-runtime Docker 镜像,但问题仍然存在。 - Koja
1个回答

5

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接