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

#c# #javascript

#c# #javascript

Вопрос:

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

Комментарии:

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

Ответ №1:

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

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

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

Комментарии:

1. Это получает тики, когда вы находитесь в C #. Смотрите Ответ pointy ниже для способа javascript.

2. добавленный номер не работает со мной, он всегда дает мне время: 21:00 предыдущего дня, но этот (621356076000000000) работает нормально, есть идеи??

3. в Google Chrome 56.0.2924.87 (64-разрядный) правильное значение равно (621356076000000000), так в чем разница между этими двумя значениями?

4. На каком языке программирования вы отвечаете — c # или JavaScript? Т.е. где это реализовано?

5. @muniR Я думаю, это потому, что вы перепутали UTC и местное время. 621355968000000000 — это UTC. Ваш номер 621356076000000000 будет таким, чтобы он работал с вашим местным временем (вы на 3 часа отстаете от времени UTC в вашем часовом поясе)

Ответ №2:

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

Источником DateTime типа .NET является полночь 1 января 0001 года.

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

 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. (621355968e9 (new Date()).getTime() * 1e4) сокращает эти 4 строки, как только у вас есть понимание. Отличная статья @LukeH

Ответ №3:

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

 var ticks = someDate.getTime();
 

Из документации MDN возвращаемое значение является

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

Комментарии:

1. тики! = миллисекунды, поэтому в C # один тик представляет сто наносекунд

Ответ №4:

Добавляется расширение принятого ответа в качестве причины 635646076777520000 .

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

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

Тип значения DateTime представляет даты и время со значениями в диапазоне от 00:00:00 (полночь) 1 января 0001 года до нашей эры (Нашей эры) до 11: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 в .Чистые тики

  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
 

Ответ №5:

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

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

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

Ответ №6:

Это должно быть 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);
}
 

Комментарии:

1. Я думаю, дата. getTime() выражается в миллисекундах