这基于在C#中计算自1970年以来的毫秒数会产生与JavaScript不同的日期和C#版本的Javascript Date.getTime()。
对于所有这些计算,请假定它们是在中央标准时间进行的,因此比协调世界时(UTC)晚6小时(此偏移量稍后将再次出现)。
我知道JavaScript的
我的输出将是:
对于所有这些计算,请假定它们是在中央标准时间进行的,因此比协调世界时(UTC)晚6小时(此偏移量稍后将再次出现)。
我知道JavaScript的
Date
对象基于Unix纪元(1970年1月1日午夜)。所以,如果我这样做://remember that JS months are 0-indexed, so February == 1
var d = new Date(2014,1,28);
d.getTime();
我的输出将是:
这代表自 Unix 纪元以来的毫秒数。这很好。在相关问题中,人们想要将这个功能翻译成 C#,而“天真”的实现通常看起来像这样:1393567200000
//the date of interest in UTC
DateTime e = new DateTime(2014, 2, 28, 0, 0, 0, DateTimeKind.Utc);
//the Unix Epoch
DateTime s = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
//the difference between the two
TimeSpan t = (e - s);
var x = t.TotalMilliseconds;
Console.WriteLine(x);
输出结果如下:
1393545600000
这是21,600,000毫秒,即6小时的差异:与进行这些计算的时区的UTC准确偏移量。
为了使C#实现与JavaScript匹配,这是实现方式:
//DateTimeKind.Unspecified
DateTime st=new DateTime(1970,1,1);
//DateTimeKind.Unspecified
DateTime e = new DateTime(2014,2,28);
//translate e to UTC, but leave st as is
TimeSpan t= (e.ToUniversalTime()-st);
var x = t.TotalMilliseconds;
Console.WriteLine(x);
我希望得到与JavaScript输出匹配的输出:
1393567200000
我还没有找到为什么我们要将代表Unix纪元的DateTime
保留为Unspecified
以匹配JavaScript的解释。我们不应该使用DateTimeKind.Utc
获得正确的结果吗?我没有理解哪些细节?这对我来说是一个纯粹学术性的问题,我只是想知道为什么会这样。
getTime()
考虑了时区。这很合理。我一直以为所有 JS 的日期计算都是基于 UTC 的。 - Sven GrosengetTime
不考虑时区。在这里的示例代码中,是new Date
构造函数考虑了时区。 - Matt Johnson-Pint