Module bptime
[hide private]
[frames] | no frames]

Source Code for Module bptime

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2003-2004 Joe Pham <djpham@netzero.com> 
  4  ### 
  5  ### This program is free software; you can redistribute it and/or modify 
  6  ### it under the terms of the BitPim license as detailed in the LICENSE file. 
  7  ### 
  8  ### $Id: bptime.py 4777 2010-01-07 03:24:27Z djpham $ 
  9   
 10  """ Module to handle BITPIM date & time """ 
 11   
 12  import calendar 
 13  import datetime 
 14  import time 
 15   
 16  timedelta=datetime.timedelta 
 17   
18 -class BPTime(object):
19 - def __init__(self, v=None):
20 self._date=self._time=None 21 # I guess this is how python handles overloading ctors 22 if isinstance(v, (str, unicode)): 23 self.set_iso_str(v) 24 elif isinstance(v, (tuple, list)): 25 self.set(v) 26 elif isinstance(v, datetime.date): 27 self._date=v
28
29 - def _get_date(self):
30 return self._date
31 date=property(fget=_get_date)
32 - def _get_time(self):
33 return self._time
34 time=property(fget=_get_time) 35
36 - def __sub__(self, rhs):
37 if isinstance(rhs, BPTime): 38 # return the delta between 2 dates 39 return datetime.datetime(*self.get())-datetime.datetime(*rhs.get()) 40 elif isinstance(rhs, (int, timedelta)): 41 # return the new date based on delta time 42 _delta=rhs if isinstance(rhs, timedelta) else \ 43 timedelta(seconds=rhs) 44 dt=datetime.datetime(*self.get())-_delta 45 return BPTime((dt.year, dt.month, dt.day, dt.hour, dt.minute)) 46 else: 47 raise TypeError
48
49 - def __add__(self, rhs):
50 if isinstance(rhs, int): 51 dt=datetime.datetime(*self.get())+datetime.timedelta(seconds=rhs) 52 elif isinstance(rhs, datetime.timedelta): 53 dt=datetime.datetime(*self.get())+rhs 54 else: 55 raise TypeError 56 return BPTime((dt.year, dt.month, dt.day, dt.hour, dt.minute))
57 - def __eq__(self, rhs):
58 if isinstance(rhs, BPTime): 59 return self.date==rhs.date 60 return False
61 - def __ne__(self, rhs):
62 if isinstance(rhs, BPTime): 63 return self.date!=rhs.date 64 return False
65 - def __lt__(self, rhs):
66 if isinstance(rhs, BPTime): 67 return self.date<rhs.date 68 return False
69 - def __le__(self, rhs):
70 if isinstance(rhs, BPTime): 71 return self.date<=rhs.date 72 return False
73 - def __gt__(self, rhs):
74 if isinstance(rhs, BPTime): 75 return self.date>rhs.date 76 return False
77 - def __ge__(self, rhs):
78 if isinstance(rhs, BPTime): 79 return self.date>=rhs.date 80 return False
81
82 - def _utc_to_local(self, offset_str=None):
83 # convert from utc time to local time 84 if self._date is None or self._time is None: 85 return 86 gmt=calendar.timegm((self._date.year, self._date.month, self._date.day, 87 self._time.hour, self._time.minute, 0)) 88 if offset_str is not None: 89 # need to apply offset 90 offset_sec=int(offset_str[1:3])*3600.0+int(offset_str[3:5])*60.0 91 if offset_str[0]=='-': 92 gmt+=offset_sec 93 else: 94 gmt-=offset_sec 95 dt=datetime.datetime.fromtimestamp(gmt) 96 self._date=dt.date() 97 self._time=dt.time()
98 - def set_iso_str(self, v):
99 # set the date/time according to the ISO string 100 # acceptable formats: 101 # YYYYMMDD, YYYYMMDDThhmm, YYYYMMDDThhmmss, YYYYMMDDThhmmssZ, 102 # YYYYMMDDThhmmss+hhmm, YYYYMMDDThhmmss-hhmm 103 v=str(v) 104 len_v=len(v) 105 if len_v<8: 106 # not long enough even for the date 107 return 108 # date componebt 109 self._date=datetime.date(int(v[:4]), int(v[4:6]), int(v[6:8])) 110 self._time=None 111 if len_v>12: 112 # time component specified 113 self._time=datetime.time(hour=int(v[9:11]), minute=int(v[11:13])) 114 # check if timezone info is specified 115 if v[-1]=='Z': 116 # UTC time 117 self._utc_to_local() 118 elif v[-5]=='-' or v[-5]=='+': 119 self._utc_to_local(v[-5:])
120
121 - def iso_str(self, no_time=False, no_seconds=True):
122 # return an ISO string representation 123 s='' 124 if self._date is not None: 125 s='%04d%02d%02d'%(self._date.year, self._date.month, 126 self._date.day) 127 if self._time is not None and not no_time: 128 s+='T%02d%02d'%(self._time.hour, self._time.minute) 129 if not no_seconds: 130 s+='00' 131 return s
132
133 - def date_str(self):
134 if self._date is None: 135 s='' 136 else: 137 s='%04d-%02d-%02d'%(self._date.year, self._date.month, 138 self._date.day) 139 return s
140
141 - def time_str(self, am_pm=True, default=''):
142 if self._time is None: 143 s=default 144 else: 145 h=self._time.hour 146 if am_pm: 147 if h>11: 148 ampm_str='pm' 149 else: 150 ampm_str='am' 151 if h>12: 152 h-=12 153 s='%02d:%02d%s'%(h, self._time.minute, ampm_str) 154 else: 155 s='%02d:%02d'%(h, self._time.minute) 156 return s
157
158 - def get(self, default=(0,0,0,0,0)):
159 if self._date is None: 160 t=default[:3] 161 else: 162 t=(self._date.year, self._date.month, self._date.day) 163 if self._time is None: 164 t+=default[3:5] 165 else: 166 t+=(self._time.hour, self._time.minute) 167 return t
168
169 - def set(self, v):
170 self._date=self._time=None 171 if len(v)>2: 172 self._date=datetime.date(*v[:3]) 173 if len(v)>4: 174 self._time=datetime.time(*v[3:])
175
176 - def mktime(self):
177 # return a float compatible with time.time() 178 return time.mktime(datetime.datetime.combine(self._date, self._time).timetuple())
179