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.
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 ;)
@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
.
@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.
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.
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.
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 ;-)
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.
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?
@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.
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.
Spoko, włączę w to wszystko daty i nie ma problemu. Dzięki. Amen.