Jak mogę obliczyć czas między dwiema datami w maszynie

138

Działa to w Javascript

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

Ale w maszynopisie nie mogę spocząć na dwóch nowych datach

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

Nie pracuj, ponieważ paremater nie pasuje do podpisu daty

user2025288
źródło

Odpowiedzi:

152

Użyj tej getTimemetody, aby uzyskać całkowity czas w milisekundach od 01.01.1970 i odejmij te:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();
Guffa
źródło
3
Myślę, że mieszasz getTime () i valueOf (). Zgodnie z dokumentacją getTime () „Pobiera wartość czasu w milisekundach”. podczas gdy to valueOf () „Zwraca zapisaną wartość czasu w milisekundach od północy 1 stycznia 1970 UTC”.
Ken Lyon
Obaj robią to samo: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 Z dokumentacji MDN getTime: Możesz użyć tej metody, aby pomóc przypisać datę i godzinę do innego obiektu Date. Ta metoda jest funkcjonalnym odpowiednikiem metody valueOf ().
PhoneixS
29
Wskazówka, zamiast używać new Date().getTime()używać Date.now(), aby niepotrzebnie nie tworzyć nowych obiektów.
PhoneixS
1
@PhoneixS Ciekawe, że są równoważne. Dzięki, że dałeś mi znać! To także dobra wskazówka dotycząca unikania tworzenia nowych obiektów.
Ken Lyon
110

Oto jak należy to zrobić na maszynie:

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

Lepsza czytelność:

      var eventStartTime = new Date(event.startTime);
      var eventEndTime = new Date(event.endTime);
      var duration = eventEndTime.valueOf() - eventStartTime.valueOf();
Siddharth Singh
źródło
3
Jest to najbardziej poprawne podejście, ponieważ javascript używa wewnętrznie „valueOf” podczas wykonywania działań arytmetycznych na obiektach. Maszynopis powinien być na tyle sprytny (unfortunataly, to jeszcze nie) w celu wspierania tego, ponieważ już wie, że metoda valueOf na randkę zwraca liczbę, jak określono w lib.d.ts
Bigjim
1
Co ciekawe, maszynopis jest teraz tak sprytny, że nawet jeśli nie zdefiniujesz eventStartTimei eventEndTimeten czas trwania zostanie wpisany jako a number(co oznacza, że ​​jeśli dosłownie weźmiesz tutaj trzecią linię kodu, czas trwania będzie tutaj liczbą)
Simon_Weaver
22

To nie działa, ponieważ Date - Dateopiera się dokładnie na rodzaju przymusu typu, który ma zapobiegać TypeScript.

Istnieje obejście tego problemu za pomocą +przedrostka:

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

Lub, jeśli wolisz nie używać Date.now():

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

Zobacz dyskusję tutaj .

Lub zobacz odpowiedź Siddhartha Singha poniżej, aby uzyskać bardziej eleganckie rozwiązanie valueOf()

Jude Fisher
źródło
1
Zatwierdzanie edycji linku, ponieważ z powodu zamknięcia CodePlex oryginalna dyskusja nie jest już dostępna pod istniejącym linkiem; o ile nie ma ogólnego sprzeciwu wobec korzystania z web.archive.org, w żaden sposób nie niszczy to ani nie niszczy oryginalnego postu, ale raczej zachowuje jego znaczenie.
Jude Fisher
11

Aby obliczyć różnicę, musisz umieścić +operator,

w ten sposób typescriptzamienia daty na liczby.

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

Stamtąd możesz utworzyć formułę, aby przekonwertować różnicę na minuteslub hours.

alexalejandroem
źródło
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) );
altergothen
źródło