Python - Program koji izračunava broj dana između dva datuma


Kalendarsko mjerenje vremena zasniva se na trajanju solarne godine, odnosno jednoj rotaciji zemlje oko sunca, koje se dijeli na dane, koji odgovaraju jednoj rotaciji zemlje oko svoje ose. Ovaj količnik nije cijeli broj, nešto je veći od 365, tako da se kalendar u danima mora povremeno usklađivati s trajanjem stvarnih astronomskih pojava. Datum se u svim kalendarima računa brojanjem dana u odnosu na neki fiksni datum u prošlosti, koji zavisi od izabranog kalendara (jevrejski, julijanski, gregorijanski, islamski, itd.). Računarski početak računanja često je datum u neposrednoj prošlosti, npr. za Gregorijanski kalendar to je dan njegovog uvođenja 1582. godine, kada je nastao diskontinuitet u kalendaru. Broj dana n između zadanog datuma dan.mesec.godina i nekog fiksnog početnog datuma, npr. početka nove ere, može se dobiti pomoću aritmetičkog izraza:

n = 365∙g + g // 4 - g // 100 + g // 400 + (m∙306 + 5) // 10 + dan - 1

gdje su:

m = (mesec + 9) % 12
g = godina - m // 10


Broj dana između dva datuma računa se jednostavno kao razlika broja dana od početka računanja za prvi (n1) i drugi datum (n2):



Osnovnu algoritam računarskog rješenja je:

  1. učitati dan1, mesec1, godina1
  2. učitati dan2, mesec2, godina2
  3. prilagoditi brojanje meseci m1= (mesec1+9) % 12 i m2= (mesec2+9) % 12
  4. prilagoditi brojanje godina g1 = godina1 - m1//10 i g2 = godina2 - m2//10
  5. izračunati redne brojeve dana:
    n1 = 365*g1 + g1//4 - g1//100 + g1//400 + (m1*306+5)//10 + dan1 - 1
    n2 = 365*g2 + g2//4 - g2//100 + g2//400 + (m2*306+5)//10 + dan2 - 1
  6. Broj dana između dva zadana datuma je n = n2 - n1.

Program za računanje broja dana između dva datuma u jeziku Python je:

""" Računanje broja dana između dva datuma
    po Gregorijanskom kalendaru (od oktobra 1582):
    1. učitati datum1 i datum 2 (dan, mesec, godina)
    2. prilagoditi brojanje meseci
    m1= (mesec1+9) % 12 i m2= (mesec2+9) % 12
    3. prilagoditi brojanje godina
    g1 = godina1 - m1//10 i g2 = godina2 - m2//10
    4. izračunati redne brojeve dana n1 i n2:
    n =365*g+g//4-g1//100+g1//400+(m*306+5)//10+dan-1
    5. Broj dana je n = n2 - n1
"""

# Unos prvog datuma
print("Unesite prvi datum")
dan1 = int(input(" dan: "))
mesec1 = int(input(" mesec: "))
godina1 = int(input(" godina: "))

# Unos drugog datuma
print("Unesite drugi datum")
dan2 = int(input(" dan: "))
mesec2 = int(input(" mesec: "))
godina2 = int(input(" godina: "))

# Prilagođavanje brojanja meseci (mart je 01) i godina
# (u skladu s brojanjem meseci)
m1= (mesec1+9) % 12
m2= (mesec2+9) % 12
g1 = godina1 - m1 // 10
g2 = godina2 - m2 // 10

# Računanje rednih brojeva dana
n1 = 365*g1 + g1 // 4 - g1//100 + g1 // 400 + \
    (m1*306+5) // 10 + dan1 - 1
n2 = 365*g2 + g2 // 4 - g2//100 + g2 // 400 + \
    (m2*306+5) // 10 + dan2 - 1

# Računanje broja dana između dva datuma i ispis
n = n2 - n1
print("Broj dana između",dan1,mesec1,godina1," i ",\
    dan2, mesec2, godina2, " je ", n)

Primjer izvršavanja programa kada se traži broj dana između Dana primirja u prvom svjetskom ratu i istog datuma 2017. godine je:

Unesite prvi datum
    dan: 11
    mesec: 11
    godina: 1918
Unesite drugi datum
    dan: 11
    mesec: 11
    godina: 2017
Broj dana između 11 11 1918 i 11 11 2017 je 36160