Як перетворити об’єкт дати JavaScript на галочки


79

Як перетворити об’єкт дати JavaScript на галочки? Я хочу використовувати галочки, щоб отримати точну дату для мого додатку C # після синхронізації даних.


1
Майте на увазі, що дату / час браузера можна встановити для будь-якого часового поясу, щоб ваші дані не мали відношення до UTC на сервері. Зазвичай я компенсую це, вводячи сервером utcnowтики (відносно 1970 р.) На сторінку і зберігаючи різницю між цим значенням і +new Date()на початку сторінки. Тоді всі дати / час можна компенсувати цією сумою. Будь-яка помилка зводиться лише до затримки сторінки.
Пропало кодування

Відповіді:


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

JavaScript DateПоходження типу - епоха Unix: опівночі 1 січня 1970 року.

Початок DateTimeтипу .NET - опівночі 1 січня 0001 року.

Ви можете перекласти об'єкт JavaScript Dateу .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
Мені подобається ця відповідь для пояснення. Дякую!
Pawel Cioch

4
(621355968e9 + (new Date()).getTime() * 1e4)стискає ці 4 рядки вниз, як тільки у вас є розуміння. Чудова частка @LukeH
SliverNinja - MSFT

39

Якщо під "галочками" ви маєте на увазі щось на зразок "мілісекунди з епохи", ви можете зателефонувати ".getTime ()".

var ticks = someDate.getTime();

З документації MDN повернене значення має значення

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


12
! Тиків = мілісекунди, тому в C # один тик є ще однією сто наносекунд
AMD

11

Розширюючись на прийняту відповідь, чому 635646076777520000 додано.

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

У .NET ( джерело в Remarksрозділах)

Тип значення DateTime представляє дати та час, значення яких варіюються від 00:00:00 (опівночі), 1 січня 0001 Анно Доміні (Спільна ера) до 23:59:59, 31 грудня 9999 р. Н.е. (CE) за григоріанською календар.

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);

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


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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.