0

我试过如何将 DateTime 转换为自 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相比,这是错误的

为什么 ?

4

2 回答 2

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,因为我在东海岸。

所以,为了迫使这如你所料,我只是将我的时间改为实际上是格林威治标准时间(将我的日期更改 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

于 2012-05-27T23:59:06.083 回答
0

与 .NETDateTime相关的类应该是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 上的选择 DateTime、DateTimeOffset 和 TimeZoneInfo

于 2012-05-28T13:22:53.547 回答