Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#将UTC转换为EDT_C#_Datetime_Utc - Fatal编程技术网

c#将UTC转换为EDT

c#将UTC转换为EDT,c#,datetime,utc,C#,Datetime,Utc,我知道在这方面有很多问题,但我还是很困惑 如何从UTC转换为EDT。i、 e.去东部时间(特别是纽约),但有夏令时吗 我正在尝试: TimeZoneInfo edtZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime utcDT = UnixTimeStampToDateTime(double.Parse(fields[0])); utcDT.Kind = DateTimeKind.Utc; /

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

如何从UTC转换为EDT。i、 e.去东部时间(特别是纽约),但有夏令时吗

我正在尝试:

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
方法不正确。假设它是从Unix纪元开始的秒数,它应该返回一个
DateTime
,并且
Kind
已经是
Utc
,例如

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);
}
编辑:现在我们可以看到现有的实现-是的,它是不合适的。没有理由要创建一个
未指定的
值,然后将其转换为
本地
值。使用上面的方法应该很好,并且通常更有用。任何需要系统本地值的现有调用都应该对
UnixTimeStampToDateTime
的结果调用
ToLocalTime


(或者,使用我的项目,您可以使用
Instant.fromssecondssinceunixepoch
获得
Instant
,然后做任何您想做的事…

我怀疑您的
unixtimestomptodatetime
方法不正确。假设它是从Unix纪元开始的秒数,它应该返回一个
DateTime
,并且
Kind
已经是
Utc
,例如

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);
}
编辑:现在我们可以看到现有的实现-是的,它是不合适的。没有理由要创建一个
未指定的
值,然后将其转换为
本地
值。使用上面的方法应该很好,并且通常更有用。任何需要系统本地值的现有调用都应该对
UnixTimeStampToDateTime
的结果调用
ToLocalTime


(或者,使用我的项目,您可以使用
Instant.FromSecondsSinceUnixEpoch
获得
Instant
,然后做任何您想做的事…

请显示UnixTimeStampToDateTime的代码。值得一提的是,它是只读的。如果您有一个本地时间,并希望获得它的UTC,您可以使用,但要小心。在任何情况下,@JonSkeet显示了一种更简洁的方式。请显示UnixTimeStampToDateTime的代码。值得一提的是,它是只读的。如果您有一个本地时间,并希望获得它的UTC,您可以使用,但要小心。无论如何,@JonSkeet展示了一种更干净的方式。@ManInMoon:是的,它在我预期的方式上基本上是有缺陷的。好吧,我明白你的意思了。我现在将我的更改为.ToUniversalTime()。我现在得到了我想要的。edtDT始终是EDT?@ManInMoon:不,您不应该使用
ToUniversalTime
,因为这是假设原始值在本地时间。您应该首先在UTC中创建它-就像我的示例一样。在创建Unix时间戳时,您不希望执行任何时区转换—您只需要表示它是以UTC开始的。没有其他时区需要参与。好的。我想我(勉强)明白了。我的文件数据绝对是UNIX UTC。我现在正在使用您的代码,并且仍然在这样做:DateTime edtDT=TimeZoneInfo.ConvertTimeFromUtc(utcDT,edtZone);所以现在我好像有EDT@曼尼蒙:是的,听起来应该没问题。@曼尼蒙:是的,它基本上有我预期的缺陷。好吧,我明白你的意思。我现在将我的更改为.ToUniversalTime()。我现在得到了我想要的。edtDT始终是EDT?@ManInMoon:不,您不应该使用
ToUniversalTime
,因为这是假设原始值在本地时间。您应该首先在UTC中创建它-就像我的示例一样。在创建Unix时间戳时,您不希望执行任何时区转换—您只需要表示它是以UTC开始的。没有其他时区需要参与。好的。我想我(勉强)明白了。我的文件数据绝对是UNIX UTC。我现在正在使用您的代码,并且仍然在这样做:DateTime edtDT=TimeZoneInfo.ConvertTimeFromUtc(utcDT,edtZone);所以现在我好像有EDT@曼尼蒙:是的,听起来应该没问题。