【问题标题】:How to properly convert a DateTime to a specific TimeZone?如何正确地将 DateTime 转换为特定的 TimeZone?
【发布时间】:2018-08-26 18:41:17
【问题描述】:

我正在尝试将此日期:Sunday 26 August 2018 18:30:00 转换为 GMT +2,因此结果应为:Today, 26 Aug 2018, 20:30

现在下面的代码可以工作了:

var unixTimeStampValue = Convert.ToInt64(1535308200);
var unixTimeStamp = unixTimeStampValue.Split("-")[0].Replace("t", "");
unixTimeStamp = Regex.Match(unixTimeStamp, @"\d+").Value;

DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
dtDateTime = dtDateTime.AddSeconds(Convert.ToInt64(unixTimeStamp));

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");
var date = TimeZoneInfo.ConvertTimeFromUtc(dtDateTime, timeInfo);

但问题是,如果我在 linux 上运行它,我会得到:

System.IO.FileNotFoundException:在本地计算机上找不到时区 ID“中欧标准时间”--> System.IO.FileNotFoundException:找不到文件“/usr/share/zoneinfo/中欧标准时间”时间”。

这个问题只出现在linux上,我该如何解决?还有其他方法可以实现这种转换吗?

【问题讨论】:

  • 大多数 Unix 机器使用 IANA 时区数据库。如果您需要同时在 Windows 和 Linux 上运行,您的选择是: 1) 根据系统确定您想要“中欧标准时间”还是“欧洲/巴黎”(如果它是单个时区也不错 - 如果你需要多个时区,它会变得很繁琐); 2) 使用Noda Time 或类似的包,让您可以在 Windows 和 Linux 上使用 IANA 时区。
  • @DaisyShipton 感谢您的回复,您能举一个 NodaTime 的例子吗?我没用过

标签: c# datetime


【解决方案1】:

根据要求,Noda Time 的示例:

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        Instant instant = Instant.FromUnixTimeSeconds(1535308200);
        DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Budapest"];
        ZonedDateTime zoned = instant.InZone(zone);
        Console.WriteLine(zoned);
    }
}

我的机器上的输出:

2018-08-26T20:30:00 Europe/Budapest (+02)

如果需要,您可以将 ZonedDateTime 转换回 DateTime,但最好使用 Noda Time 尽可能多地处理日期/时间,以获得全部好处。

【讨论】:

猜你喜欢
  • 2011-09-29
  • 2015-11-26
  • 1970-01-01
  • 2019-09-05
  • 2020-10-07
  • 2021-01-07
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多