【问题标题】:Can't get exact Unix UTC seconds无法获得准确的 Unix UTC 秒数
【发布时间】:2012-05-27 23:34:59
【问题描述】:

我尝试了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

为什么?

【问题讨论】:

  • 时区和/或 DST,可能。请参阅 Chad 对您提到的问题的回答。
  • 我不明白为什么本地时间很重要,因为自 1970 年以来的秒数在任何地区都是一样的?

标签: c# date unix-timestamp


【解决方案1】:

这很可能来自时区差异。如果将值存储在临时变量中并查看,您可能会看到 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

【讨论】:

  • 好的,谢谢,但是输入是不变的,算法应该在任何国家/地区都可以工作,无论其语言环境是美国还是欧洲或亚洲:) 它应该像在线网站一样工作。
  • 我试过 origin.AddHours(-4) 但结果是一样的?
  • 我的意思是 date.AddHours(-4)
【解决方案2】:

.NET DateTime 相关的类应该Just Work。他们经常这样做,但如果您使用的不是当地时间,则必须注意细节。 (这不是特定于 .NET 的问题 - 时区,尤其是 DST,通常会让人头疼。)无论您的语言环境如何,以下 sn-p 都应该产生正确的输出:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多