我在EpochTime获得时间。当我使用功能转换为当地时间时,我将失去1小时。我不确定计算是否错误。你可以复习吗。
private DateTime ConvertUnixEpochTime(long seconds)
{
DateTime Fecha = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Debug.WriteLine("Converted time in gmt " + Fecha.AddSeconds(seconds));
Debug.WriteLine("Converted time in local time " + Fecha.ToLocalTime().AddSeconds(seconds));
Debug.WriteLine("EpochTime" + seconds);
Debug.WriteLine("current local time " + DateTime.Now);
Debug.WriteLine("current time in gmt " + DateTime.Now.ToUniversalTime());
return Fecha.ToLocalTime().AddSeconds(seconds);
}
以下是debug.write语句的摘录。
TickString Tick value: 1401395106 Tick Type: LAST_TIMESTAMP // this is the input
Converted time in gmt 2014-05-29 8:25:06 PM // this is the converted tiem in GMT
Converted time in local time 2014-05-29 3:25:06 PM // this is the converted time to local EST Timezone
EpochTime1401395106
current local time 2014-05-29 4:31:33 PM // Current local time in EST
current time in gmt 2014-05-29 8:31:33 PM // Current local Time in GMT
答案 0 :(得分:3)
问题是您在转换为本地时间后添加秒。
换句话说,您将Unix纪元转换为EST,然后再添加1401395106秒。
Insteead,你应该在Unix纪元上添加1401395106秒,然后转换为本地时间 - 即E D T,而不是E S T.了解差异非常重要 - 您在东部时间,目前正在观察EDT或UTC-4。 DateTime.AddSeconds
并未将任何时区转换考虑在内 - 它只是以天真的方式添加秒。小时丢失的地方 - 因为你在美国东部时间(UTC-5)转换它,但结束于美国东部时间的日期。
所以这里的代码应该适合你:
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Debug.WriteLine("Converted time in gmt " + epoch.AddSeconds(seconds));
Debug.WriteLine("Converted time in local time " +
epoch.AddSeconds(seconds).ToLocalTime());
我个人虽然使用了Noda Time,但却更容易犯这种错误:
Instant instant = Instant.FromSecondsSinceUnixEpoch(seconds);
// Or use DateTimeZoneProviders.Bcl.GetSystemDefault(), maybe...
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/New_York"];
ZonedDateTime zoned = instant.InZone(zone);