Wiem, że mogę zrobić wszystko i trochę bardziej zaangażowanych Daty z momentjs. Ale zawstydzające, trudno mi zrobić coś, co wydaje się proste: uzyskać różnicę między 2 razy.
Przykład:
var now = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
//expected result:
"00:39:30"
co próbowałem:
var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");
console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30
Nie rozumiem, co to tam jest „10”. Mieszkam w Brazylii, więc jesteśmy utc-0300, jeśli to istotne.
Wynikiem moment.duration(now.diff(then))
jest czas trwania z prawidłowymi wartościami wewnętrznymi:
days: 0
hours: 0
milliseconds: 0
minutes: 39
months: 0
seconds: 30
years: 0
Wydaje mi się, że moje pytanie brzmi: jak przekonwertować parametr Chwilowość na przedział czasu? Na pewno mogę użyć
duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")
ale czuję, że jest coś bardziej eleganckiego , czego mi całkowicie brakuje.
aktualizacja
szuka się bliżej, w powyższym przykładzie now
jest:
Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}
i moment(moment.duration(now.diff(then)))
jest:
Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}
Nie jestem pewien, dlaczego drugą wartością jest czas letni (-0200) ... ale jestem pewien, że nie lubię dat :(
aktualizacja 2
Cóż, wartość wynosi -0200 prawdopodobnie dlatego, że 31.12.1969 była datą, w której użyto czasu dziennego ... więc to tyle.
Odpowiedzi:
To podejście zadziała TYLKO, gdy całkowity czas trwania jest krótszy niż 24 godziny:
Jeśli masz 24 godziny lub więcej, godziny zostaną zresetowane do zera przy powyższym podejściu, więc nie jest to idealne.
Jeśli chcesz uzyskać prawidłową odpowiedź na czas 24 godzin lub dłuższy, musisz zamiast tego zrobić coś takiego:
Zauważ, że używam czasu utc jako skrótu. Możesz wyciągnąć
d.minutes()
id.seconds()
osobno, ale będziesz musiał je też zerować.Jest to konieczne, ponieważ
duration
obecnie nie można sformatować sprzeciwu w chwili.js. Poproszono o to tutaj . Istnieje jednak wtyczka innej firmy o nazwie format czasu trwania, która jest specjalnie do tego celu:źródło
Twój problem polega na tym, że przekazujesz wynik moment.duration () z powrotem do momentu () przed sformatowaniem; powoduje to, że moment () interpretuje go jako czas związany z epoką Uniksa.
Nie daje dokładnie takiego formatu, jakiego szukasz, ale
moment.duration(now.diff(then)).humanize()
dałby ci przydatny format, np. „40 minut”. Jeśli naprawdę zależy Ci na tym konkretnym formatowaniu, musisz samodzielnie zbudować nowy ciąg. Tani byłby sposób
[diff.asHours(), diff.minutes(), diff.seconds()].join(':')
gdzie
var diff = moment.duration(now.diff(then))
. To nie daje zerowania dla wartości jednocyfrowych. W tym celu możesz rozważyć coś takiego jak podkreślenie. Ciąg - chociaż wydaje się, że jest to długa droga do przejścia tylko o kilka dodatkowych zer. :)źródło
asHours
zamiasthours
i usunąć dziesiętne. W przeciwnym razie miałby to ten sam problem, co problem. :)[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')
w celu uzyskania pożądanego rezultatu. bez dziesiętnego w pierwszej częściPracował dla mnie
Zobacz więcej w http://momentjs.com/docs/#/displaying/difference/
źródło
Jeśli chcesz różnicę dwóch znaczników czasu w całkowitych dniach, godzinach i minutach, a nie w miesiącach i latach.
diff zawiera 2 miesiące, 23 dni, 23 godziny i 20 minut. Ale potrzebujemy wyniku tylko w dniach, godzinach i minutach, więc proste rozwiązanie to:
Ostateczny wynik to: 84 dni, 23 godziny, 20 minut.
źródło
Kiedy dzwonisz
diff
, moment.js oblicza różnicę w milisekundach. Jeśli milisekundy są przekazywaneduration
, służy do obliczania poprawnego czasu trwania. Jednak. kiedy przekażesz te same milisekundymoment()
, oblicza datę w milisekundach od (po) epoki / czasu uniksowego, czyli 1 stycznia 1970 r. (północ UTC / GMT). Dlatego otrzymujesz rok 1969 wraz z niewłaściwą godziną.Więc myślę, że tak powinieneś to zrobić, ponieważ moment.js nie oferuje
format
funkcji na czas trwania. Lub możesz napisać proste opakowanie, aby było łatwiejsze / ładniejsze.źródło
To powinno działać dobrze.
źródło
Jeśli chcemy tylko hh: mm: ss, możemy użyć takiej funkcji:
źródło
Użyj tego,
źródło
Zamiast
Lepiej to zrobić
źródło
W ES8 używaj momentu, teraz i zacznij być obiektem momentu.
źródło
Maszynopis: następujące powinny działać,
źródło
Tworzę prostą funkcję za pomocą maszynopisu
do generowania javascript https://www.typescriptlang.org/play/index.html
źródło
InTime = 06: 38, Outtime = 15: 40
źródło
WEJŚCIE OPARTE NA CZASIE
WYNIK
źródło
RÓŻNICA CZASU EPOCH ZA POMOCĄ MOMENTJS :
Aby uzyskać różnicę między dwoma epokami:
Składnia:
moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()
Różnica godzin:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()
Różnica w minutach:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()
Uwaga: Możesz usunąć,
.toFixed()
jeśli potrzebujesz dokładnych wartości.Kod:
Zapoznaj się z przykładem działania tutaj: https://repl.it/repls/MoccasinDearDimension
źródło