Як я можу обчислити час між 2 датами в машинописі


138

Це працює в Javascript

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

Але в машинописі я не можу відпочити два нові дати

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

Не працюйте, оскільки paremater не відповідає підпису дати

Відповіді:


152

Використовуйте getTimeметод, щоб отримати час у загальних мілісекундах з 1970-01-01, і відніміть такі:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();

3
Я думаю, ви змішуєте getTime () та valueOf (). Згідно з документами, getTime () "Отримує значення часу в мілісекундах." враховуючи, що це valueOf (), яке "Повертає збережене значення часу в мілісекундах з півночі 1 січня 1970 за UTC".
Кен Ліон

Обидва роблять те ж саме: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

29
Порада, замість того, щоб використовувати new Date().getTime()використання, Date.now()щоб ви не робили нових об’єктів без потреби.
PhoneixS

1
@PhoneixS Цікаво про те, що вони рівноцінні. Дякую що дали мені знати! Крім того, це хороша порада щодо уникнення створення нових об’єктів.
Кен Ліон

110

Ось як це слід зробити в машинописі:

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

3
Це найбільш правильний підхід, оскільки javascript використовує "valueOf" внутрішньо при виконанні арифметики на об'єктах. Typescript повинен бути досить розумним (на жаль, поки що це не так), щоб підтримати це, оскільки він уже знає, що метод valueOf для дати повертає число, визначене в lib.d.ts
Bigjim

1
Цікаво, що машинопис зараз настільки розумний, що навіть якщо ви не визначаєте eventStartTimeта eventEndTimeтривалість набирається як number(тобто якщо ви буквально берете третій рядок коду тут, тут тривалість буде число)
Simon_Weaver

22

Це не працює, оскільки 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, це жодним чином не пошкоджує та не пошкоджує оригінальну публікацію, а зберігає її значення.
Джуд Фішер

11

Для того, щоб обчислити різницю, вам потрібно поставити +оператора,

таким чином typescriptперетворюються дати в числа.

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

Звідти ви можете скласти формулу для перетворення різниці в minutesабо hours.


3
// TypeScript

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

// Explicitly convert Date to Number
const pastDaysOfYear = ( Number(today) - Number(firstDayOfYear) );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.