Skip to content

Commit 0c5522a

Browse files
committed
adding time utils
1 parent 7db6854 commit 0c5522a

File tree

1 file changed

+256
-1
lines changed

1 file changed

+256
-1
lines changed

time_utils.py

Lines changed: 256 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,256 @@
1-
../../../dev/sesh-dash/dev/sesh/seshdash/utils/time_utils.py
1+
from datetime import datetime,timedelta
2+
from dateutil.parser import parse
3+
from time import localtime,strftime
4+
from django.conf import settings
5+
from pytz import timezone
6+
from django.utils import timezone as timezone_dt
7+
from tzwhere import tzwhere
8+
9+
10+
def get_epoch(tz=None):
11+
"""
12+
Return number of seconds since 1970-01-01- epoch
13+
"""
14+
now = datetime.now()
15+
if tz:
16+
tz = _clean_tz(tz)
17+
now = timezone_dt.now(tz)
18+
epoch = datetime(1970,1,1)
19+
diff = now - epoch
20+
diff = str(diff.total_seconds())
21+
diff_seconds = diff.split('.')
22+
diff_int = diff_seconds[0]
23+
return diff_int
24+
25+
def get_yesterday(tz=None):
26+
27+
now = datetime.date(datetime.now())
28+
if tz:
29+
tz = _clean_tz(tz)
30+
now = timezone_dt.now(tz)
31+
32+
one_day = timedelta(days=1)
33+
return now - one_day
34+
35+
36+
def get_time_interval_array(interval,interval_type,start,end,tz=None):
37+
"""
38+
Get an array between the provided time frame
39+
with slices in the given interval timedelta
40+
between start and end
41+
"""
42+
43+
if tz:
44+
tz = _clean_tz(tz)
45+
timez = timezone(tz)
46+
else:
47+
timez = timezone(settings.TIME_ZONE)
48+
# TODO finish timezone implemenation
49+
result = []
50+
kwargs = {}
51+
kwargs[interval_type] = interval
52+
interval = timedelta(**kwargs)
53+
while start < end:
54+
start = start + interval
55+
result.append(start)
56+
57+
return result
58+
59+
def get_epoch_from_datetime(date):
60+
"""
61+
Return number of seconds since 1970-01-01- epoch
62+
from given date
63+
@params: dateobject
64+
"""
65+
epoch = datetime(1970,1,1)
66+
if date.tzinfo:
67+
epoch = datetime(1970,1,1,tzinfo=date.tzinfo)
68+
diff = date - epoch
69+
seconds_only = str(diff.total_seconds())
70+
seconds_only_str = seconds_only.split('.')
71+
seconds_only = seconds_only_str[0]
72+
return seconds_only
73+
74+
def get_epoch_from_date(year, month, day, hours, minutes, tz=None):
75+
"""
76+
Return number of seconds since 1970-01-01- epoch
77+
from given date
78+
@params: month,day,year,hours,minutes
79+
"""
80+
date = datetime(year,month,day,hours,minutes)
81+
if tz:
82+
tz = _clean_tz(tz)
83+
date = datetime(year,month,day,hours,minutes,tzinfo=tz)
84+
85+
epoch = datetime(1970,1,1)
86+
diff = date - epoch
87+
return diff.total_seconds()
88+
89+
def localize(nv_datetime,tz):
90+
"""
91+
Add timezone info to datetime object
92+
"""
93+
if not isinstance(nv_datetime,datetime):
94+
try:
95+
# Try to convert to datetime
96+
time = datetime(nv_datetime)
97+
except Exception, e:
98+
return nv_datetime
99+
# Is our datetime object naive?
100+
if nv_datetime.tzinfo is not None and nv_datetime.tzinfo.utcoffset(nv_datetime) is not None:
101+
return nv_datetime
102+
localtz = timezone(tz)
103+
dt_aware = localtz.localize(nv_datetime)
104+
return dt_aware
105+
106+
107+
def epoch_to_date(seconds_time, tz=None):
108+
"""
109+
Translate seconds time to date
110+
"""
111+
time = strftime('%Y-%m-%d',localtime(seconds_time))
112+
if tz:
113+
tz = _clean_tz(tz)
114+
time = localize(time,tz)
115+
116+
return time
117+
118+
def get_timezone_from_geo(lat, lon):
119+
"""
120+
Return String TimeZone from provided lat,lon
121+
"""
122+
tz = tzwhere.tzwhere()
123+
return tz.tzNameAt(float(lat), float(lon))
124+
125+
def epoch_to_datetime(seconds_time, tz=None):
126+
"""
127+
Translate seconds time to datetime object
128+
"""
129+
time = datetime.fromtimestamp(seconds_time)
130+
131+
if tz:
132+
tz = _clean_tz(tz)
133+
time = localize(time,tz)
134+
135+
136+
#return strftime('%Y-%m-%dT%XZ',time)
137+
return time
138+
139+
140+
def get_last_five_days(from_date="now", tz=None):
141+
"""
142+
Get last days returned to you as datetime objects in array
143+
@params:
144+
from_date: (date to return consecutive days ongoing from) (optional)
145+
"""
146+
days = []
147+
148+
now = datetime.now()
149+
if not from_date == "now":
150+
now = timezone.now()
151+
152+
if not from_date == "now":
153+
now = from_date
154+
155+
delta = now - timedelta(5)
156+
for day in xrange(1,6):
157+
days.append(delta)
158+
delta = delta + timedelta(1)
159+
return days
160+
161+
162+
def get_days_interval_delta(start, end, delta=1):
163+
164+
"""
165+
return the days inbetween the two sepcified dates
166+
@params:
167+
start: when is the interval stardate, datetime object
168+
end: when should the interval end , datatime object
169+
delta: increments in which to return dates, integer, default 1 day
170+
"""
171+
delta = timedelta(days=delta)
172+
curr = start
173+
days = []
174+
while curr < end:
175+
days.append(curr)
176+
curr += delta
177+
return days
178+
179+
def get_start_end_date(days_ago, start_day):
180+
"""
181+
get the delta of days ago from given start date
182+
"""
183+
delta = start_day - timedelta(days=days_ago)
184+
return delta
185+
186+
def get_timesince_seconds(time, tz=None):
187+
"""
188+
Get timesince and time provided
189+
"""
190+
now = timezone_dt.now()
191+
if tz:
192+
now = timezone(tz).localize(datetime.now())
193+
194+
#loc = timezone(settings.TIME_ZONE)
195+
#now = loc.localize(now)
196+
diff = now - time
197+
return int(diff.total_seconds())
198+
199+
def get_timesince(time, tz=None):
200+
201+
now = datetime.now()
202+
if tz:
203+
tz = _clean_tz(tz)
204+
now = timezone_dt.now(tz)
205+
206+
loc = timezone(settings.TIME_ZONE)
207+
now = loc.localize(now)
208+
diff = now - time
209+
diff = format_timesince_seconds(int(diff.total_seconds()))
210+
return diff
211+
212+
def format_timesince_seconds(seconds):
213+
seconds = abs(seconds)
214+
if seconds < 60:
215+
if seconds == 1:
216+
return seconds, " second ago"
217+
else:
218+
return seconds, " seconds ago"
219+
elif seconds < 3600:
220+
if seconds/60 < 2: # if it is still a minute
221+
return seconds/60, " minute ago"
222+
else:
223+
return seconds/60, " minutes ago"
224+
elif seconds < 86400:
225+
if seconds/3600 < 2:
226+
return seconds/3600, " hour ago"
227+
else:
228+
return seconds/3600, " hours ago"
229+
230+
else:
231+
if seconds/86400 < 2:
232+
return seconds/86400, " day ago"
233+
else:
234+
return seconds/86400, " days ago"
235+
236+
237+
def get_date_dashed(date):
238+
date_string = str(date.year) + '-' + str(date.month) + '-' + str(date.day)
239+
return date_string
240+
241+
242+
def convert_influx_time_string(date_string, tz=None):
243+
""" Converts influx style strings to datetime """
244+
parsed = parse(date_string)
245+
246+
if tz:
247+
parsed =parsed.astimezone(timezone(tz))
248+
249+
return parsed
250+
251+
def get_timesince_influx(date_string):
252+
date_obj = convert_influx_time_string(date_string)
253+
return get_timesince(date_obj)
254+
255+
def _clean_tz(tz):
256+
return tz.strip().replace('\'','').replace('\"','')

0 commit comments

Comments
 (0)