Jak obliczyć minutesbetween pomiędzy godz. 23:00 i 01:00, ale "do tyłu"?

0

System w takiej sytuacji liczy minuty "do przodu" czyli pomiędzy godz. 01:00 i 23:00 i zwraca 1320 minut, a ja bym chciał, żeby obliczył "w tył" i zwrócił wynik 120 minut i nie mogę wpaść na jakieś sensowne rozwiązanie.

1

Czy wynik, który chcesz uzyskać to nie jest 24*60 (ilość minut w ciągu doby) odjąć 1320?

Dla podanego przykładu otrzymamy 1440-1320 = 120 ;)

1

@axel234 - przecież pomiędzy godziną 01:00 a 23:00 jest 1320 minut...

var
  dtFirst, dtSecond: TDateTime;
begin
  dtFirst  := EncodeDateTime(2015, 1, 1, 23, 0, 0, 0);  // ten sam dzień co poniżej
  dtSecond := EncodeDateTime(2015, 1, 1,  1, 0, 0, 0);  // ten sam dzień co powyżej

  WriteLn(MinutesBetween(dtFirst, dtSecond));
end.

Powyższy kod zwróci 1320 i to jest poprawny wynik; Jeżeli chcesz otrzymać wynik 120, a raczej 119, to godzina 23:00 musi należeć do dnia poprzedniego, bo wtedy faktycznie pomiedzy jedną godziną a drugą będzie tyle minut:

var
  dtFirst, dtSecond: TDateTime;
begin
  dtFirst  := EncodeDateTime(2015, 1, 1, 23, 0, 0, 0);  // dzień wcześniejszy
  dtSecond := EncodeDateTime(2015, 1, 2,  1, 0, 0, 0);  // dzień późniejszy

  WriteLn(MinutesBetween(dtFirst, dtSecond));
end.

Wynik - 119.

0

@furious programming - Ja to wiem, że pomiędzy tymi godzinami jest 1320 minut, nie musisz mnie uświadamiać. Dlatego zapytałem jak najszybciej obliczyć to "w tył"
Dokładnie o rozwiązaniu z datą myślałem, ale sądziłem, że znajdzie się na to jakaś inna metoda. Dzięki.

1

Dlatego zapytałem jak najszybciej obliczyć to "w tył"

Nadal nie rozumiesz - jeżeli dwie daty wskazują na ten sam dzień, to wynik może być tylko i wyłącznie jeden - 1320 minut; I nie ma znaczenia kolejność podanych argumentów do funkcji MinutesBetween, bo różnica jest jedna;

Dziś jest czwartek, więc różnica pomiędzy 01:00 a 23:00 to właśnie 1320 minut, bez względu czy liczysz od tyłu czy od przodu; Jeśli ma Ci wyjść ~120 minut, to taka różnica występuje tylko w przypadku, gdy godzina 23:00 należy do dnia wczorajszego (do środy), a godzina 01:00 do dnia dzisiejszego (czyli czwartku); I tak samo - nie ma znaczenia czy liczysz od tyłu czy od przodu - różnica jest jedna;


Nie mam dostępu do źródeł biblioteki standardowej Delphi, ale w module DateUtils dla FPC, funkcja ta wygląda tak:

Function MinutesBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+TDateTimeEpsilon)*MinsPerDay);
end;

Niestety, ale taka jest natura funkcji MinutesBetween, że wynik różnicy traktowany jest dodatkowo funkcją Abs, przez co zawsze jest dodatni.

0

Nie, to ty nie rozumiesz tego, że ja to rozumiem. Nie musisz mi dawać wykładu na ten temat. I ostatni raz powtarzam: zadałem to pytanie po to, żeby upewnić się, czy nie ma innej metody na obliczenie tej różnicy bez mieszania w to dat. Nie ma, więc temat jest dla mnie zamknięty.

0
axel234 napisał(a):

zadałem to pytanie po to, żeby upewnić się, czy nie ma innej metody na obliczenie tej różnicy bez mieszania w to dat. Nie ma, więc temat jest dla mnie zamknięty.

No jak to nie ma, przecież w poście http://4programmers.net/Forum/1120863 mateusz2813 podał metodę policzenia tej różnicy bez podawania dat.

@furious programming masz rację, ale przecież obydwaj rozumiecie już o co chodzi ;-)

0

Nie, to ty nie rozumiesz tego, że ja to rozumiem.

No tak - ja nie rozumiem i dokładnie wiem dlaczego wynik jest taki, a Ty założyłeś wątek bo wszystko rozumiesz i nie wiesz dlaczego wynik jest inny, niż oczekujesz.

0
fourfour napisał(a):
axel234 napisał(a):

zadałem to pytanie po to, żeby upewnić się, czy nie ma innej metody na obliczenie tej różnicy bez mieszania w to dat. Nie ma, więc temat jest dla mnie zamknięty.

No jak to nie ma, przecież w poście http://4programmers.net/Forum/1120863 mateusz2813 podał metodę policzenia tej różnicy bez podawania dat.

@furious programming masz rację, ale przecież obydwaj rozumiecie już o co chodzi ;-)

Sposób @mateusz2813 dobry, ale tylko wtedy kiedy wiadomo, że daty są różne. Spróbuj skorzystać z tej metody i obliczyć różnicę wtedy, kiedy data jest ta sama.
Bez mieszania w to dat i tak nie da się z metody @mateusz2813 skorzystać. Chyba, że coś pochrzaniłem?

0

@axel234 - jeśli data jest taka sama, to różnica minut siłą rzeczy musi wynosić 1320 i to jest jedyna poprawna wartość; Wynik 120 przy takich samych datach jest po prostu błędny i nie może Ci taki wyjść - spróbuj to zrozumieć;

A jeśli już koniecznie chcesz uzyskać te 120, to wystarczy odjąć wcześniejszą godzinę od późniejszej, to od 24 i pomnożyć razy 60, albo skorzystać z rachunków @mateusz2813 - dla tych samych dat oczywiście; Dla różnych dat dojdzie dodatkowo liczenie różnic miesięcy i lat, tylko że nie wiem do czego jest Ci to potrzebne.

0
axel234 napisał(a):

Sposób @mateusz2813 dobry, ale tylko wtedy kiedy wiadomo, że daty są różne. Spróbuj skorzystać z tej metody i obliczyć różnicę wtedy, kiedy data jest ta sama.
Bez mieszania w to dat i tak nie da się z tej metody skorzystać. Chyba, że coś pochrzaniłem?

Można przecież (dla Twoich celów) założyć, że jeśli podajesz do liczącej ten interwał funkcji parametry, to zawsze pierwszym jest godzina "od", a późniejszym "do". Funkcja ma za zadanie zwrócić poprawny wynik (gdy godzina "od" jest późniejsza od "do" funkcja musi odjąć wyliczoną "bezwzględną" liczbę godzin od liczby godzin całej doby). W ten sposób pomiędzy 23:00 a 1:00 będą dwie godziny, a pomiędzy 1:00 a 23:00 - dwadzieścia dwie.

0

Spoko, włączę w to wszystko daty i nie ma problemu. Dzięki. Amen.

1 użytkowników online, w tym zalogowanych: 0, gości: 1