Вычисление миллисекунд с 1970 года в C# дает другую дату, чем JavaScript

мне нужно вычислить JavaScript методов gettime метод в C#.

для простоты я выбрал фиксированную дату в 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

никаких намеков на то, что я делаю неправильно?

спасибо!

3 ответов


если вы имели в виду, что вход должен быть в UTC, вы должны делать это вместо этого:

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

как указал Слакс, месяцы работают 0-11, но даже тогда-вы должны инициализировать дату как UTC, если хотите получить ответ в UTC. В вашем коде вы инициализировали местные дата, а потом преобразование это в UTC. Результат будет отличаться в зависимости от часового пояса компьютера, на котором выполняется код. С Date.UTC, вы получаете метку - не а Date object, и это будет тот же результат независимо от того, где он работает.

из консоли отладки Chrome:

Debug Output

это то же самое значение, возвращенное из вашего .NET-кода, который выглядит просто отлично, за исключением того, что я бы вернул long, а не string.


Javascript месяцев на основе нуля.
12 означает январь следующего года.

вы хотите 11.


дата JS ошибочна, я считаю. Опустить var utcDate строка и вывод просто d.getTime()

время между двумя датами, независимо от часового пояса и смещение. Часовые пояса относительно фактического момента времени, так ли вы называете .getTime() на UTC или est или PST дата, это будет то же самое относительно 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

EDIT: в @Slaks выше, вы также не используете месяц на основе 0 (который я также понятия не имел о.)