c#将UTC转换为EDT
我知道在这方面有很多问题,但我还是很困惑 如何从UTC转换为EDT。i、 e.去东部时间(特别是纽约),但有夏令时吗 我正在尝试: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; /
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@曼尼蒙:是的,听起来应该没问题。