【问题标题】:c# convert UTC to EDT时间:2019-04-01 标签:c#convert UTC to EDT
【发布时间】:2013-08-05 15:07:05
【问题描述】:

我知道这方面有很多问题,但我还是很困惑!

如何从 UTC 转换为 EDT。即到 EST(尤其是纽约)但有夏令时?

我正在尝试这个:

TimeZoneInfo edtZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime utcDT = UnixTimeStampToDateTime(double.Parse(fields[0]));
utcDT.Kind = DateTimeKind.Utc; //THIS LINE IS WRONG
DateTime edtDT = TimeZoneInfo.ConvertTimeFromUtc(utcDT, edtZone);


//Put in for as requested
        public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
        {
            // Unix timestamp is seconds past epoch
            System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToLocalTime();
            return dtDateTime;
        }

谢谢

【问题讨论】:

  • 请出示 UnixTimeStampToDateTime 的代码。
  • 不管怎样,DateTime.Kind 是只读的。如果您 本地时间并且想要获取它的UTC,您可以使用DateTime.ToUniversalTime,但要小心。无论如何,@JonSkeet 展示了一种更简洁的方式。

标签: c# datetime utc


【解决方案1】:

我怀疑您的 UnixTimeStampToDateTime 方法不正确。假设它花费了自 Unix 纪元以来的秒数,它应该返回一个 DateTime 和一个 KindUtc,例如

private static readonly DateTime UnixEpoch = 
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static DateTime UnixTimeStampToDateTime(double secondsSinceUnixEpoch)
{
    return UnixEpoch.AddSeconds(secondsSinceUnixEpoch);
}

编辑:现在我们可以看到现有的实现 - 是的,这是不合适的。没有理由要创建 Unspecified 值,然后将其转换为 Local 值。使用上述内容应该没问题,并且通常更有用。 需要系统本地值的任何现有调用都应根据UnixTimeStampToDateTime的结果调用ToLocalTime

(或者,使用我的Noda Time 项目,您可以使用Instant.FromSecondsSinceUnixEpoch 获取Instant,然后做任何你想做的事情......)

【讨论】:

  • @ManInMoon:是的,这基本上是我预期的缺陷。
  • 好的,我明白你的意思了。我现在将我的更改为 .ToUniversalTime()。我现在得到我想要的了吗。 edtDT 总是 EDT?
  • @ManInMoon:不,你不应该使用ToUniversalTime,因为这是假设原始值在本地时间。您应该以 UTC 开头 - 就像我的示例一样。您不想在创建 Unix 时间戳时执行 任何 时区转换 - 您只需要表示它以 UTC 开头。无需涉及其他时区。
  • 好的。我想我理解(几乎)。我的文件数据绝对是 UNIX UTC。我现在正在使用您的代码,并且仍在执行此操作: DateTime edtDT = TimeZoneInfo.ConvertTimeFromUtc(utcDT, edtZone);所以现在我似乎有 EDT!
  • @ManInMoon:是的,听起来应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2020-05-07
  • 2016-10-23
  • 2011-01-31
  • 2013-04-11
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多