Как я могу рассчитать время между двумя датами в машинописном тексте

146

Это работает в Javascript

new Date()-new Date("2013-02-20T12:01:04.753Z")

Но в машинописном тексте я не могу успокоить две новые даты

Date("2013-02-20T12:01:04.753Z")

Не работает, потому что парматер не соответствует подписи даты

user2025288
источник

Ответы:

162

Используйте этот getTimeметод, чтобы получить общее время в миллисекундах с 01.01.1970 и вычтите это:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();
Гуффа
источник
3
Я думаю, вы путаете getTime () и valueOf (). Согласно документации, getTime () «Получает значение времени в миллисекундах». тогда как это valueOf (), которое «Возвращает сохраненное значение времени в миллисекундах с полуночи 1 января 1970 года по всемирному координированному времени».
Ken Lyon
Оба делают то же самое:new Date(1970, 1, 1, 0, 0, 0, 0).valueOf() // returns 2674800000 new Date(1970, 1, 1, 0, 0, 0, 0).getTime() // returns 2674800000
prespic
@KenLyon Из документации MDN getTime: вы можете использовать этот метод, чтобы помочь назначить дату и время другому объекту Date. Этот метод функционально эквивалентен методу valueOf ().
PhoneixS 06
33
Совет, вместо использования new Date().getTime()используйте, Date.now()чтобы не создавать новые объекты без надобности.
PhoneixS 06
1
@PhoneixS Интересно, что они эквивалентны. Спасибо, что дали мне знать! Кроме того, это хороший совет, как избегать создания новых объектов.
Кен Лион
119

Вот как это должно быть сделано в машинописном тексте:

(new Date()).valueOf() - (new Date("2013-02-20T12:01:04.753Z")).valueOf()

Лучшая читаемость:

      var eventStartTime = new Date(event.startTime);
      var eventEndTime = new Date(event.endTime);
      var duration = eventEndTime.valueOf() - eventStartTime.valueOf();
Сиддхарт Сингх
источник
4
Это наиболее правильный подход, поскольку javascript внутренне использует "valueOf" при выполнении арифметических операций с объектами. TypeScript должен быть достаточно умным (к сожалению, пока что это не так), чтобы поддерживать это, поскольку он уже знает, что метод valueOf для Date возвращает число, как определено в lib.d.ts
Bigjim
1
Интересно, что машинописный текст теперь настолько умен, что даже если вы не определяете, eventStartTimeи eventEndTimeэта длительность набирается как number(то есть, если вы буквально возьмете третью строку кода здесь сама по себе, здесь продолжительность будет числом)
Simon_Weaver
24

Это не работает, потому что Date - Dateполагается на то, что TypeScript предназначен для предотвращения принуждения типов.

Есть обходной путь с использованием +префикса:

var t = Date.now() - +(new Date("2013-02-20T12:01:04.753Z");

Или, если вы предпочитаете не использовать Date.now():

var t = +(new Date()) - +(new Date("2013-02-20T12:01:04.753Z"));

См. Обсуждение здесь .

Или см. Ответ Сиддхарта Сингха ниже для более элегантного решения с использованием valueOf()

Джуд Фишер
источник
1
Утверждение редактирования ссылки, потому что из-за закрытия CodePlex исходное обсуждение больше не доступно по существующей ссылке; если нет каких-либо явных возражений против использования web.archive.org, это никоим образом не повредит и не испортит исходный пост, а скорее сохранит его смысл.
Джуд Фишер
13

Чтобы рассчитать разницу, вам нужно поставить + оператор:

таким образом typescriptдаты преобразуются в числа.

+new Date()- +new Date("2013-02-20T12:01:04.753Z")

Оттуда вы можете составить формулу для преобразования разницы в minutesили hours.

Alexalejandroem
источник
4
// TypeScript

const today = new Date();
const firstDayOfYear = new Date(today.getFullYear(), 0, 1);

// Explicitly convert Date to Number
const pastDaysOfYear = ( Number(today) - Number(firstDayOfYear) );
альтерготен
источник