【问题标题】:Computing milliseconds since 1970 in C# yields different date than JavaScript在 C# 中计算自 1970 年以来的毫秒数会产生与 JavaScript 不同的日期
【发布时间】:2014-02-27 21:43:11
【问题描述】:

我需要在 C# 中计算 JavaScript getTime 方法。

为简单起见,我选择了 UTC 中的固定日期并比较了 C#:

C#
DateTime e = new DateTime(2011, 12, 31, 0, 0, 0, DateTimeKind.Utc);
DateTime s = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
TimeSpan t = (e - s);
var x = t.TotalMilliseconds.ToString();
=> 1325289600000

以及 JavaScript 结果:

JavaScript
var d = new Date(2011, 12, 31, 0, 0, 0)
var utcDate = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());
utcDate.getTime()
=> 1327960800000

关于我做错了什么的任何提示?

谢谢!

【问题讨论】:

  • 为什么需要UTC时间来计算两个日期之间的秒数?不管什么时区,答案在任何时区都是一样的。
  • 因为在 C# 中,我正在从存储日期为 UTC 的数据库中读取日期。
  • 当我执行你的 js 代码时,我得到 - 1328004000000 - jsfiddle.net/k5Z7h/1
  • @EkoostikMartin 答案在任何时区都不相同,因为时区会随着时间而变化,尤其是在过去 40 年中。

标签: c# javascript datetime datetime-format


【解决方案1】:

Javascript 月份从零开始。
12 表示明年一月。

你想要11

【讨论】:

  • 对!要检查,只需输入控制台new Date(1327960800000)。结果:Mon Jan 30 2012 20:00:00 GMT-0200 (Local Daylight Time)
【解决方案2】:

如果您希望输入为 UTC,则应改为:

var ts = Date.UTC(2011,11,31,0,0,0);

正如 SLaks 所指出的,月份从 0 到 11 运行,但即便如此 - 如果您希望以 UTC 格式响应,则必须将日期初始化为 UTC。在您的代码中,您正在初始化一个 本地 日期,然后将其转换 为 UTC。结果会有所不同,具体取决于运行代码的计算机的时区。使用Date.UTC,您会得到一个时间戳——而不是Date 对象,无论它在哪里运行,它都会得到相同的结果。

来自 Chrome 的调试控制台:

这与您的 .NET 代码返回的值相同,看起来很好,但我会返回 long,而不是 string

【讨论】:

    【解决方案3】:

    我认为 JS 的日期是错误的。省略var utcDate 行并仅输出d.getTime()

    无论时区和偏移量如何,两个日期之间的时间都是相同的。时区是相对于 ACTUAL 时间点的,因此无论您在 UTC 或 EST 或 PST 日期调用 .getTime(),它都将与同一时区的 1970-1-1 相同。

    2011-12-31 EST - 1970-1-1 EST 
        == 2011-12-31 PST - 1970-1-1 PST 
        == 2011-12-31 UTC - 1970-1-1 UTC
    

    编辑:根据上面的@Slaks,您也没有使用基于 0 的月份(我也不知道)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多