Computing milliseconds since 1970 in C# yields dif

2019-04-23 15:00发布

I need to compute the JavaScript getTime method in C#.

For simplicity, I chose a fixed date in UTC and compared the 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

and the JavaScript results:

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

Any hints on what I'm doing wrong?

Thanks!

3条回答
2楼-- · 2019-04-23 15:46

The date JS is wrong I believe. Omit the var utcDate line and output just d.getTime()

The time between two dates is the same, regardless of timezone and offset. Timezones are relative to an ACTUAL point in time, so whether you call .getTime() on the UTC or EST or PST date, it will be the same relative to 1970-1-1 of the same timezone.

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

EDIT: Per @Slaks above, you also are not using the 0-based month (which I also had no idea about).

查看更多
地球回转人心会变
3楼-- · 2019-04-23 15:58

If you meant for the input to be at UTC, you should be doing this instead:

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

As SLaks pointed out, months run 0-11, but even then - you must initialize the date as UTC if you want the response in UTC. In your code, you were initializing a local date, and then converting it to UTC. The result would be different depending on the time zone of the computer where the code is running. With Date.UTC, you get back a timestamp - not a Date object, and it will be the same result regardless of where it runs.

From Chrome's debugging console:

Debug Output

This is the same value returned from your .NET code, which looks just fine, except I would return a long, not a string.

查看更多
Evening l夕情丶
4楼-- · 2019-04-23 16:06

Javascript months are zero-based.
12 means January of next year.

You want 11.

查看更多
登录 后发表回答