text: # -------------------------------------------------------------------------- #
  # Copyright (c) 2021. Nikola Vukićević                                       #
  # -------------------------------------------------------------------------- #
  
  import math
  
  sekundeUMinutu  = 60
  sekundeUSatu    = sekundeUMinutu * 60;   # 360
  sekundeUDanu    = sekundeUSatu   * 24;   # 8640
  sekundeUGodiniN = sekundeUDanu   * 365;  # 3153600
  sekundeUGodiniP = sekundeUDanu   * 366;  # 3162240
  
  dani = [
  	365, 365, 366, 365, 365, 365, 366, 365, 365, 365,  # 1970 - 1979
      366, 365, 365, 365, 366, 365, 365, 365, 366, 365,  # 1980 - 1989
      365, 365, 366, 365, 365, 365, 366, 365, 365, 365,  # 1990 - 1999
      366, 365, 365, 365, 366, 365, 365, 365, 366, 365,  # 2000 - 2010
      365, 365, 366, 365, 365, 365, 366, 365, 365, 365,  # 2010 - 2019
      366, 365, 365, 365, 366, 365, 365, 365, 366, 365,  # 2020 - 2029
      365, 365, 366, 365, 365, 365, 366, 365, 365, 365,  # 2030 - 2039
      366, 365, 365, 365, 366, 365, 365, 365, 366, 365,  # 2040 - 2049
      365, 365, 366, 365, 365, 365, 366, 365, 365, 365,  # 2050 - 2059
      366, 365, 365, 365, 366, 365, 365, 365, 366, 365,  # 2060 - 2069
  ]
  
  meseciN = [
  	0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  ]
  
  meseciP = [
  	0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  ]
  
  def inicijalizacijaNiza(niz):
  	r = range(1, len(niz))
  	for i in r:
  		niz[i] = niz[i] + niz[i - 1]
  
  inicijalizacijaNiza(dani)
  inicijalizacijaNiza(meseciN)
  inicijalizacijaNiza(meseciP)
  
  
  def binarnaPretraga(n, niz):
  	le  = 0
  	de  = len(niz) - 1;
  	ind = math.floor((le + de) * 0.5)
  		
  	while(le < de):
  		if n == niz[ind]: return ind
  			
  		if(n < niz[ind]):
  			de = ind - 1
  		else:
  			le = ind + 1
  		
  		ind = math.floor((le + de) * 0.5)
  
  	return ind;
  
  def pronalazenjeGodine(dan, niz, epoha):
  	if dan <= 365:
  		return {
  			'godina':    epoha,
  			'korekcija': 0
  		}
  
  	ind = binarnaPretraga(dan, niz)
  
  	return {
  		'godina':    epoha + ind,
  		'korekcija': niz[ind - 1]
  	}
  
  
  def daLiJePrestupna(godina):
  	if godina % 4 == 0:
  		if godina % 100 == 0:
  			if godina % 400 == 0: return True
  			return False
  		else:
  			return True
  	
  	return False
  
  def pronalazenjeMeseca(dan, prestupna, nizN, nizP):
  	if prestupna == True:
  		niz = nizP
  	else:
  		niz = nizN
  	
  	ind = binarnaPretraga(dan, niz)
  		
  	return {
  		'mesec':     ind,
  		'korekcija': niz[ind - 1]
  	}
  
  def timestampUDatum(t):
  	stamp          = t / sekundeUDanu
  	stamp          = math.ceil(stamp)
  	rez            = pronalazenjeGodine(stamp, dani, 1970)
  	godina         = rez['godina']
  	prestupna      = daLiJePrestupna(godina)
  	danUGodini     = stamp - rez['korekcija']
  	rez            = pronalazenjeMeseca(danUGodini, prestupna, meseciN, meseciP)
  	mesec          = rez['mesec']
  	dan            = danUGodini - rez['korekcija']
  
  	return {
  		'godina': godina,
  		'mesec':  mesec,
  		'dan':    dan
  	}
  
  print(timestampUDatum(1627723319))
  