Как преобразовать объект даты JavaScript в тики

79

Как мне преобразовать объект даты JavaScript в тики? Я хочу использовать галочки, чтобы получить точную дату для моего приложения C # после синхронизации данных.

Тальха
источник
1
Имейте в виду, что дата / время в браузере могут быть установлены на любой часовой пояс, поэтому ваши данные не будут относиться к UTC на сервере. Я обычно компенсирую это, вводя серверные utcnowтики (относительно 1970) на страницу и сохраняя разницу между этим значением и значением +new Date()в начале страницы. Тогда вся дата / время могут быть смещены на эту величину. Любая ошибка связана только с задержкой страницы.
Gone Coding

Ответы:

119

Если вы хотите преобразовать свой DateTimeобъект в универсальные галочки, используйте следующий фрагмент кода:

var ticks = ((yourDateObject.getTime() * 10000) + 621355968000000000);

В миллисекунде 10000 тиков. И 621.355.968.000.000.000 тиков между 1 - го января 0001 и 1 - го января 1970 года.

Шейх Али
источник
5
Это привлекает внимание, когда вы работаете на C #. См. Заостренный ответ ниже для способа javascript.
Марк
Должен признаться, мне это не нравится, но это работает :(
Милтон
1
добавленный номер не работает со мной, он всегда дает мне время: 21:00 в предыдущий день, но этот (621356076000000000) работает нормально, любая идея ??
MuniR
в Google Chrome 56.0.2924.87 (64-разрядная версия) правильное значение (621356076000000000), так какая разница между этими двумя значениями?
okarpov
Для какого языка программирования вы отвечаете - C # или JavaScript? Т.е. где это реализовано?
barrypicker
55

DateПроисхождение типа JavaScript - это эпоха Unix: полночь 1 января 1970 года.

DateTimeПроисхождение типа .NET - полночь 1 января 0001 года.

Вы можете преобразовать Dateобъект JavaScript в тики .NET следующим образом:

var yourDate = new Date();  // for example

// the number of .net ticks at the unix epoch
var epochTicks = 621355968000000000;

// there are 10000 .net ticks per millisecond
var ticksPerMillisecond = 10000;

// calculate the total number of .net ticks for your date
var yourTicks = epochTicks + (yourDate.getTime() * ticksPerMillisecond);
Лука
источник
1
Мне нравится этот ответ для объяснения. Благодаря!
Павел Чох
4
(621355968e9 + (new Date()).getTime() * 1e4)сокращает эти 4 строки, как только у вас будет понимание. Отличная публикация @LukeH
SliverNinja - MSFT
39

Если под «тиками» вы подразумеваете что-то вроде «миллисекунд с начала эпохи», вы можете вызвать «.getTime ()».

var ticks = someDate.getTime();

Из документации MDN возвращаемое значение - это

Целочисленное значение, представляющее количество миллисекунд с 00:00:00 1 января 1970 г. по всемирному координированному времени (Unix Epoch).

Заостренный
источник
12
ticks! = миллисекунды, поэтому в C # один тик представляет сто наносекунд
amd
11

Развернув принятый ответ 635646076777520000, добавлено почему .

Javascript new Date().getTime() or Date.now()вернет количество прошедших миллисекунд midnight of January 1, 1970.

В .NET ( источник в Remarksразделах)

Тип значения DateTime представляет дату и время со значениями в диапазоне от 00:00:00 (полночь), 1 января 0001 г., Anno Domini (наша эра) до 23:59:59, 31 декабря 9999 г. н.э. (н.э.) по григорианскому календарю. календарь.

621355968000000000это значение тиков от midnight Jan 1 01 CEдоmidnight Jan 1 1970

Итак, в .NET

  Console.Write(new DateTime(621355968000000000))
  // output 1/1/1970 12:00:00 AM

Следовательно, чтобы преобразовать время javascript в тики .Net

 var currentTime = new Date().getTime();

 // 10,000 ticks in 1 millisecond
 // jsTicks is number of ticks from midnight Jan 1, 1970
 var jsTicks = currentTime * 10000;

 // add 621355968000000000 to jsTicks
 // netTicks is number of ticks from midnight Jan 1, 01 CE
 var netTicks = jsTicks + 621355968000000000;

Теперь в .NET

 Console.Write(new DateTime(netTicks))
 // output current time
Саами
источник
6

Дата в JavaScript также содержит смещение. Если вам нужно избавиться от него, используйте следующее:

return ((date.getTime() * 10000) + 621355968000000000) - (date.getTimezoneOffset() * 600000000);

Я использую решение Скейха и вычитаю тики для «смещения».

michal.jakubeczy
источник
2

Так и должно быть date.GetTime(). Имейте в виду, что C # и Javascript используют разные начальные даты, поэтому используйте что-то подобное для преобразования в C # DateTime.

public static DateTime GetDateTime(long jsSeconds)
{
    DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return unixEpoch.AddSeconds(jsSeconds);
}
Питер
источник