Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # esempio: come usare questa classe in una funzione esterna
- # from calendar import sun
- # s = sun()
- # oppore s = (latitudine,longitudine)
- # alba = s.sunrise() restituisce oggetto time
- # tramonto = s.sunset() restituisce oggetto time
- # zenith = s.solarnoon() restituisce oggetto time
- # local_time = datetime.datetime.now() restituisce oggetto datatime
- # utc_time = datetime.datetime.utcnow() restituisce oggetto datatime
- # oppure utc_time = s. timeutc() restituisce oggetto datatime
- from math import cos,sin,acos,asin,tan
- from math import degrees as deg, radians as rad
- from datetime import date,datetime,time
- import datetime
- import urllib2
- import string
- class sun:
- def __init__(self,lat=43.252,long=13.5097): # default Corridonia
- # __init__ Costruttore di oggetto
- self.lat=lat
- self.long=long
- # MIA FUNZIONE: data e ora UTC presa da internet
- # esempio chiamata alla funzione self.timeutc()
- def timeutc(self):
- nomefile = "http://just-the-time.appspot.com/"
- line = urllib2.urlopen(nomefile).read()
- line = line[:-1]
- [data,ora,description] = string.split(line," ") # separo le variabili
- [anno,mese,giorno] = string.split(data,"-")
- [ore,minuti,secondi] = string.split(ora,":")
- millisecondi = 0
- return datetime.datetime(int(anno),int(mese),int(giorno),int(ore),int(minuti),int(secondi),millisecondi)
- # alba
- def sunrise(self,when=None):
- # if when is None : when = datetime.datetime.now()
- # datetime.datetime.now() mi restituisce data eora attuale
- # datetime.datetime.utcnow() mi restituisce data e ora UTC (di Greenwich)
- if when is None : when = datetime.datetime.utcnow()
- self.__preptime(when)
- self.__calc()
- return sun.__timefromdecimalday(self.sunrise_t)
- # tramonto
- def sunset(self,when=None):
- if when is None : when = datetime.datetime.utcnow()
- self.__preptime(when)
- self.__calc()
- return sun.__timefromdecimalday(self.sunset_t)
- # mezzogiorno solare
- def solarnoon(self,when=None):
- if when is None : when = datetime.datetime.utcnow()
- self.__preptime(when)
- self.__calc()
- return sun.__timefromdecimalday(self.solarnoon_t)
- @staticmethod
- def __timefromdecimalday(day):
- # day formatta i tre valori di self.solarnoon_t self.sunrise_t self.sunset_t
- hours = 24.0*day
- h = int(hours)
- minutes= (hours-h)*60
- m = int(minutes)
- seconds= (minutes-m)*60
- s = int(seconds)
- return time(hour=h,minute=m,second=s)
- def __preptime(self,when):
- # datetime days are numbered in the Gregorian calendar
- # while the calculations from NOAA are distibuted as
- # OpenOffice spreadsheets with days numbered from
- # 1/1/1900. The difference are those numbers taken for
- # 18/12/2010
- self.day = when.toordinal()-(734124-40529) # la data attuale in giorni dai primi del 1900
- t=when.time() # t a come valore l'ora attuale
- self.time= (t.hour + t.minute/60.0 + t.second/3600.0)/24.0
- # timezone ora solare +1 ora legale +2
- # imposto timezone a 0 cosi ottengo ora UTC rispetto a Greenwich
- self.timezone=0
- offset=when.utcoffset() # offset vale None
- if not offset is None:
- self.timezone=offset.seconds/3600.0
- def __calc(self):
- timezone = self.timezone # in hours, east is positive
- longitude= self.long # in decimal degrees, east is positive
- latitude = self.lat # in decimal degrees, north is positive
- time = self.time # percentage past midnight, i.e. noon is 0.5
- day = self.day # daynumber 1=1/1/1900
- Jday =day+2415018.5+time-timezone/24 # Julian day
- Jcent =(Jday-2451545)/36525 # Julian century
- Manom = 357.52911+Jcent*(35999.05029-0.0001537*Jcent)
- Mlong = 280.46646+Jcent*(36000.76983+Jcent*0.0003032)%360
- Eccent = 0.016708634-Jcent*(0.000042037+0.0001537*Jcent)
- Mobliq = 23+(26+((21.448-Jcent*(46.815+Jcent*(0.00059-Jcent*0.001813))))/60)/60
- obliq = Mobliq+0.00256*cos(rad(125.04-1934.136*Jcent))
- vary = tan(rad(obliq/2))*tan(rad(obliq/2))
- Seqcent = sin(rad(Manom))*(1.914602-Jcent*(0.004817+0.000014*Jcent))+sin(rad(2*Manom))*(0.019993-0.000101*Jcent)+sin(rad(3*Manom))*0.000289
- Struelong= Mlong+Seqcent
- Sapplong = Struelong-0.00569-0.00478*sin(rad(125.04-1934.136*Jcent))
- declination = deg(asin(sin(rad(obliq))*sin(rad(Sapplong))))
- eqtime = 4*deg(vary*sin(2*rad(Mlong))-2*Eccent*sin(rad(Manom))+4*Eccent*vary*sin(rad(Manom))*cos(2*rad(Mlong))-0.5*vary*vary*sin(4*rad(Mlong))-1.25*Eccent*Eccent*sin(2*rad(Manom)))
- hourangle= deg(acos(cos(rad(90.833))/(cos(rad(latitude))*cos(rad(declination)))-tan(rad(latitude))*tan(rad(declination))))
- self.solarnoon_t=(720-4*longitude-eqtime+timezone*60)/1440
- self.sunrise_t =self.solarnoon_t-hourangle*4/1440
- self.sunset_t =self.solarnoon_t+hourangle*4/1440
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement