Wyznaczenie liczby dni pomiędzy datami

0

Chcemy wyznaczyć liczbę dni np. od 2000-1-1 do 2018-7-18,

no to ja to robię tak: liczba lat = 2018-2000 = 18,
co mnożę przez liczbę dni na rok: 18*365.25 = 6574.5, czyli 6575 po zaokrągleniu

teraz wystarczy dodać do tego pozostałe dni, co jest już proste.

Sprawdźmy czy to działa: 2000-1-1 do 2018-1-1 = 365 * 18 i + przestępne lata, których było: 2000, 2004, 2008, 2012 i 2016, razem 5.

365 * 18 + 5 = 6575, zgadza się.

To takie proste?

2

Zapomniałeś o paru rzeczach...

0

Zależy gdzie.
Boos mam bibliotekę do dat:
https://www.boost.org/doc/libs/1_39_0/doc/html/date_time/gregorian.html
Qt ma swoją własną klasę.

Natomiast do samego czasu:
http://www.cplusplus.com/reference/chrono/

Trochę w opozycji do @MarekR22 ale staram się jak tylko mogę szukać alternatyw dla bibliotek C, jeżeli piszę w C++ :)

0

Po co mi biblioteki?

dni = 365.25 * (r1 - r2)

i gotowe.

wychodzi mi taka prostacka konwersja daty (r, m d), na liczbę dni:

int M[] = {0,31,59,90,120,151,181,212,243,273,304,334,365};
int date2dni(y, m, d)
{
   int  n = y*365.25;
   if( (y % 4) ||  m > 2 ) n++;

 return (n+M[m-1]+d-1);
}

zatem aby wyliczyć liczbę dni pomiędzy dwoma datami wystarczy odjąć dwa numery:

dni = date2dni(y1, m1, d1) - date2dni(y0, m0, d0);
2

Po to, żeby nie tracić czasu na wymyślanie czegoś na nowo. Po to są biblioteki, żeby z nich korzystać.

0

Początek offtopu.

Po co mi biblioteki?

Byłem w projekcie gdzie przede mną panowała filozofia Po co linkować boost'a skoro możemy napisać to sami. Z nieopisaną satysfakcją usuwałem potem te fragmenty systemu.

Koniec offtopu.

1
date2dni(2000,2,28) - date2dni(2000,3,1)                    -2
date2dni(2100,2,28) - date2dni(2100,3,1)                    -2
date2dni(2101,2,28) - date2dni(2101,3,1)                    -1

No tak średnio bym powiedział. Już nawet nie zastanawiając się, czy przypadkiem nie zostaniesz tu ugryziony przez floaty.

0
kq napisał(a):
date2dni(2000,2,28) - date2dni(2000,3,1)                    -2
date2dni(2100,2,28) - date2dni(2100,3,1)                    -2
date2dni(2101,2,28) - date2dni(2101,3,1)                    -1

No tak średnio bym powiedział. Już nawet nie zastanawiając się, czy przypadkiem nie zostaniesz tu ugryziony przez floaty.

to działa chyba tylko od 1901 do 2099, czyli w naszych czasach.

Do wyliczania aż od Chrystusa do 5000r i dalej, należałoby uwzględniać te setki nieprzestępne: 1900 nie był przestępny, 1800 podobnie, dopiero 1600 był.

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