447 lines
9.9 KiB
Python
447 lines
9.9 KiB
Python
import time
|
|
from datetime import date, datetime, tzinfo
|
|
import arrow
|
|
# from babel.dates import format_date, format_datetime, format_time, get_timezone, UTC
|
|
from settings import config
|
|
#from paramecio.citoplasma.sessions import get_session
|
|
from os import environ
|
|
|
|
|
|
sql_format_time='YYYYMMDDHHmmss'
|
|
|
|
format_date_txt="YYYY/MM/DD"
|
|
|
|
format_time_txt="HH:mm:ss"
|
|
|
|
timezone='Europe/Madrid'
|
|
|
|
if hasattr(config, 'format_date'):
|
|
format_date_txt=config.format_date
|
|
|
|
if hasattr(config, 'format_time'):
|
|
format_time_txt=config.format_time
|
|
|
|
if hasattr(config, 'timezone'):
|
|
timezone=config.timezone
|
|
|
|
def set_timezone():
|
|
|
|
environ['TZ']=environ.get('TZ', timezone)
|
|
|
|
if environ['TZ']!=timezone:
|
|
environ['TZ']=timezone
|
|
time.tzset()
|
|
|
|
"""
|
|
def set_timezone_session():
|
|
|
|
s=get_session()
|
|
|
|
timezone_local=timezone
|
|
|
|
if s!=None:
|
|
if 'timezone' in s:
|
|
timezone_local=s['timezone']
|
|
#timezone_local=s.get('timezone', timezone)
|
|
|
|
environ['TZ']=environ.get('TZ', timezone_local)
|
|
|
|
if environ['TZ']!=timezone_local:
|
|
environ['TZ']=timezone_local
|
|
time.tzset()
|
|
|
|
#request.environ['TIMEZONE'] = request.environ['PATH_INFO'].rstrip('/')
|
|
"""
|
|
|
|
def format_timedata(time):
|
|
|
|
year=0
|
|
month=0
|
|
day=0
|
|
hour=0
|
|
minute=0
|
|
second=0
|
|
ampm=''
|
|
|
|
try:
|
|
|
|
year=int(time[:4])
|
|
|
|
month=int(time[4:6])
|
|
|
|
day=int(time[6:8])
|
|
|
|
hour=int(time[8:10])
|
|
|
|
minute=int(time[10:12])
|
|
|
|
second=int(time[12:14])
|
|
|
|
ampm=int(time[14:16])
|
|
|
|
except:
|
|
pass
|
|
|
|
if ampm=='PM' or ampm=='pm':
|
|
|
|
if hour>0:
|
|
hour+=12
|
|
|
|
return (year, month, day, hour, minute, second)
|
|
|
|
def checkdatetime(y, m, d, h, mi, s):
|
|
|
|
try:
|
|
#test=datetime.strptime(str(y)+'-'+str(m)+'-'+str(d)+' '+str(h)+'-'+str(mi)+'-'+str(s), '%Y-%m-%d %H-%M-%S')
|
|
test=arrow.arrow.Arrow(y, m, d, h, mi, s)
|
|
return True
|
|
except:
|
|
return False
|
|
|
|
# Get the localtime
|
|
|
|
def now(utc=False, tz=''):
|
|
"""
|
|
actual=datetime.today()
|
|
|
|
# Get localtime
|
|
|
|
final_date=actual.strftime(sql_format_time)
|
|
#Go to gmt
|
|
|
|
if utc:
|
|
|
|
final_date=local_to_gmt(final_date)
|
|
|
|
return final_date
|
|
"""
|
|
|
|
if not utc:
|
|
if tz=='':
|
|
actual=arrow.now().format(sql_format_time)
|
|
else:
|
|
#actual=arrow.to(tz).now().format(sql_format_time)
|
|
utc=arrow.utcnow()
|
|
actual=utc.to(tz).format(sql_format_time)
|
|
else:
|
|
actual=arrow.utcnow().format(sql_format_time)
|
|
|
|
return actual
|
|
|
|
def today(utc=False,tz=''):
|
|
|
|
return now(utc, tz)[:8]+'000000'
|
|
|
|
# Get actual timestamp
|
|
|
|
def obtain_timestamp(timeform, local=False, tz=''):
|
|
|
|
y, m, d, h, mi, s=format_timedata(timeform)
|
|
|
|
if checkdatetime(y, m, d, h, mi, s):
|
|
|
|
#timestamp=int(time.mktime((y, m, d, h, mi, s, 0, 0, -1)))
|
|
|
|
if local:
|
|
|
|
#offset=time.altzone
|
|
|
|
#return timestamp-offset
|
|
|
|
if tz=='':
|
|
tz=environ.get('TZ', 'utc')
|
|
|
|
t=arrow.arrow.Arrow(y, m, d, h, mi, s).to(tz)
|
|
|
|
timestamp=t.timestamp()
|
|
|
|
else:
|
|
timestamp=arrow.arrow.Arrow(y, m, d, h, mi, s).timestamp()
|
|
|
|
return timestamp
|
|
|
|
#return mktime($h, $mi, $s, $m, $d, $y);
|
|
else:
|
|
return False
|
|
|
|
# timestamp is gmt time, convert in normal time
|
|
|
|
def timestamp_to_datetime(timestamp):
|
|
|
|
#time_set=substract_utc(timestamp)
|
|
|
|
#return time.strftime(sql_format_time, time_set)
|
|
|
|
return arrow.get(timestamp).format(sql_format_time)
|
|
|
|
# Get a utc timestamp and convert to local
|
|
|
|
def timestamp_to_datetime_local(timestamp, tz=''):
|
|
|
|
#time_set=time.localtime(timestamp)
|
|
|
|
#return time.strftime(sql_format_time, time_set)
|
|
|
|
t=arrow.get(timestamp)
|
|
|
|
if tz=='':
|
|
tz=environ['TZ']
|
|
|
|
return t.to(tz).format(sql_format_time)
|
|
|
|
|
|
def format_datetime(format_time, timeform, func_utc_return):
|
|
|
|
timestamp=obtain_timestamp(timeform)
|
|
|
|
if timestamp:
|
|
|
|
t=func_utc_return(timestamp)
|
|
|
|
return t.format(format_time)
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
# This method parse local time to gmt
|
|
|
|
def local_to_gmt(timeform, sql_format_time=sql_format_time):
|
|
|
|
return format_datetime(sql_format_time, timeform, substract_utc)
|
|
|
|
# time.localtime is useless, you need sum the time offset to the date
|
|
|
|
def gmt_to_local(timeform, sql_format_time=sql_format_time):
|
|
|
|
return format_datetime(sql_format_time, timeform, sum_utc)
|
|
|
|
def format_time(timeform):
|
|
|
|
return format_datetime(format_time_txt, timeform, sum_utc)
|
|
|
|
def format_date(timeform):
|
|
|
|
return format_datetime(format_date_txt, timeform, sum_utc)
|
|
|
|
def format_fulldate(timeform):
|
|
|
|
return format_datetime(format_date_txt+' '+format_time_txt, timeform, sum_utc)
|
|
|
|
def format_local_time(timeform):
|
|
|
|
return format_datetime(format_time_txt, timeform, no_utc)
|
|
|
|
def format_local_date(timeform):
|
|
|
|
return format_datetime(format_date_txt, timeform, no_utc)
|
|
|
|
def format_local_fulldate(timeform):
|
|
|
|
return format_datetime(format_date_txt+' '+format_time_txt, timeform, no_utc)
|
|
|
|
def format_strtime(strtime, timeform):
|
|
|
|
return format_datetime(strtime, timeform, sum_utc)
|
|
|
|
def format_local_strtime(strtime, timeform):
|
|
|
|
return format_datetime(strtime, timeform, no_utc)
|
|
|
|
#Input is utc timestamp, return local arrow object
|
|
|
|
def sum_utc(timestamp, tz=''):
|
|
|
|
#offset=time.altzone
|
|
|
|
#return time.localtime(timestamp-offset)
|
|
|
|
t=arrow.get(timestamp)
|
|
|
|
if tz=='':
|
|
tz=environ['TZ']
|
|
|
|
return t.to(tz)
|
|
|
|
#Input is local timestamp, return utc arrow object
|
|
|
|
def substract_utc(timestamp, tz=''):
|
|
|
|
#offset=time.altzone
|
|
|
|
#return time.localtime(timestamp+offset)
|
|
|
|
#t=arrow.get(timestamp).to('UTC')
|
|
|
|
timeform=timestamp_to_datetime(timestamp)
|
|
|
|
y, m, d, h, mi, s=format_timedata(timeform)
|
|
|
|
if tz=='':
|
|
tz=environ['TZ']
|
|
|
|
t=arrow.get(datetime(y, m, d, h, mi, s), tz).to('UTC')
|
|
|
|
return t
|
|
|
|
def no_utc(timestamp):
|
|
|
|
return arrow.get(timestamp)
|
|
|
|
# def date_to_sql(date_sql):
|
|
|
|
|
|
|
|
class TimeClass:
|
|
|
|
def __init__(self, timestamp=None, tz=''):
|
|
|
|
self.utc=False
|
|
|
|
self.format_time=sql_format_time
|
|
self.format_time_txt=format_time_txt
|
|
|
|
self.format_date_txt=format_date_txt
|
|
|
|
self.format_date_full=format_date_txt+' '+format_time_txt
|
|
|
|
self.tz=environ.get('TZ', 'utc')
|
|
|
|
if tz:
|
|
self.tz=tz
|
|
|
|
if type(timestamp).__name__=='int':
|
|
"""
|
|
if self.utc:
|
|
|
|
self.datetime=utcnow()
|
|
|
|
else:
|
|
"""
|
|
self.datetime=timestamp_to_datetime(timestamp)
|
|
|
|
else:
|
|
|
|
if not timestamp:
|
|
|
|
self.datetime=now(self.utc, tz)
|
|
|
|
else:
|
|
self.datetime=timestamp
|
|
|
|
y, m, d, h, mi, s=format_timedata(self.datetime)
|
|
|
|
self.t=arrow.get(datetime(y, m, d, h, mi, s), self.tz)
|
|
|
|
def add_month(self, num_months):
|
|
|
|
m=self.t.shift(months=+num_months)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def substract_month(self, num_months):
|
|
|
|
m=self.t.shift(months=-num_months)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def add_day(self, num_days):
|
|
|
|
m=self.t.shift(days=+num_days)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def substract_day(self, num_days):
|
|
|
|
m=self.t.shift(days=-num_days)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def add_year(self, num_years):
|
|
|
|
m=self.t.shift(years=+num_years)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def substract_year(self, num_years):
|
|
|
|
m=self.t.shift(years=-num_years)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def add_hour(self, num_hours):
|
|
|
|
m=self.t.shift(hours=+num_hours)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def substract_hour(self, num_hours):
|
|
|
|
m=self.t.shift(hours=-num_hours)
|
|
|
|
return m.format(self.format_time)
|
|
|
|
def format(self):
|
|
|
|
return self.t.format(self.format_date_full)
|
|
|
|
def local_to_utc(self):
|
|
|
|
self.t=self.t.to('utc')
|
|
|
|
# Only use
|
|
|
|
def utc_to_local(self):
|
|
|
|
self.t=self.t.to(self.tz)
|
|
|
|
def local_to_tz(self, tz):
|
|
|
|
self.t=self.t.to(tz)
|
|
|
|
def now(self, utc=False):
|
|
|
|
if not utc:
|
|
|
|
actual=arrow.now(self.tz).format(sql_format_time)
|
|
else:
|
|
actual=arrow.utcnow().format(sql_format_time)
|
|
|
|
return actual
|
|
|
|
def today(self, utc=False):
|
|
|
|
if utc:
|
|
|
|
return arrow.utcnow()[:8]+'000000'
|
|
else:
|
|
return arrow.now(self.tz)[:8]+'000000'
|
|
|
|
def timestamp_to_datetime(self, timestamp):
|
|
|
|
return arrow.get(timestamp).format(sql_format_time)
|
|
|
|
def obtain_timestamp(self, timeform):
|
|
|
|
y, m, d, h, mi, s=format_timedata(timeform)
|
|
|
|
if checkdatetime(y, m, d, h, mi, s):
|
|
|
|
timestamp=arrow.arrow.Arrow(y, m, d, h, mi, s).timestamp
|
|
|
|
return timestamp
|
|
|
|
else:
|
|
return False
|
|
|
|
def format_strtime(self, strtime, timeform):
|
|
|
|
#timestamp=self.obtain_timestamp(timeform)
|
|
try:
|
|
y, m, d, h, mi, s=format_timedata(timeform)
|
|
|
|
return arrow.get(datetime(y, m, d, h, mi, s), self.tz).format(strtime)
|
|
|
|
except:
|
|
|
|
return False
|