无法获得确切的Unix UTC秒

时间:2012-05-27 23:35:00

标签: c# date unix-timestamp

我用

尝试了How can I convert a DateTime to the number of seconds since 1970?
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    DateTime date = DateTime.Parse(@"28/05/12 01:30");
    TimeSpan diff = date.ToUniversalTime() - origin;
    Console.WriteLine( (Math.Floor(diff.TotalSeconds)).ToString());

输出= 1338161400

与之相比是错误的 http://www.mbari.org/staff/rich/utccalc.htm 1338168600

为什么?

2 个答案:

答案 0 :(得分:2)

这很可能来自时区差异。如果将值存储在临时变量中并查看,您可能会看到ToUniversalTime正确修改原始值:

        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        DateTime date = DateTime.Parse(@"05/28/2012 01:30:00");
        date = date.ToUniversalTime();

在我的情况下,当我将日期设置为UniversalTime后,我将时间视为5:30:00,因为我在东海岸。

所以,为了强制这个按照你的预期,我只是把我的时间转移到了GMT(将我的约会时间改为4小时:

        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        DateTime date = DateTime.Parse(@"05/27/2012 9:30:00 pm");
        date = date.ToUniversalTime();
        TimeSpan diff = date - origin;
        Console.WriteLine((Math.Floor(diff.TotalSeconds)).ToString());

这会产生:1338168600

答案 1 :(得分:0)

.NET DateTime相关的类应该 Just Work 。他们经常这样做,但如果你在当地时间以外的任何地方工作,你必须注意细节。 (这不是特定于.NET的问题 - 时区,尤其是DST,经常导致严重的问题。)以下代码段应该产生正确的输出,无论您的语言环境如何:

DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
DateTime date = DateTime.Parse(@"28/05/12 01:30", null, System.Globalization.DateTimeStyles.AssumeUniversal);
TimeSpan diff = date.ToUniversalTime() - origin;
Console.WriteLine((Math.Floor(diff.TotalSeconds)).ToString());

请注意,对于两个输入日期,需要明确指定日期应被视为UTC日期而不是本地日期。 ToUniversalTime()电话似乎是多余的,但必须产生适当的差异。这似乎是对减号运算符执行的疏忽。

另请参阅MSDN上的Choosing Between DateTime, DateTimeOffset, and TimeZoneInfo