0

我知道对此有很多问题,但我仍然感到困惑!

如何从 UTC 转换为 EDT。即到美国东部标准时间(特别是纽约)但有夏令时?

我正在尝试这个:

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;
        }

谢谢

4

1 回答 1

3

我怀疑你的UnixTimeStampToDateTime方法不正确。假设它花费了自 Unix 纪元以来的秒数,它应该返回 aDateTime和 a 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。使用上述内容应该没问题,并且通常更有用。任何需要系统本地值的现有调用都应ToLocalTime调用UnixTimeStampToDateTime.

(或者,使用我的Noda Time项目,您可以在其中Instant.FromSecondsSinceUnixEpoch获得一个Instant,然后做任何您想做的事情......)

于 2013-08-05T15:10:25.407 回答