从大纪元转换时失去时间

时间:2014-05-29 20:38:18

标签: c#

我在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

1 个答案:

答案 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);