0001 ### BITPIM 0002 ### 0003 ### Copyright (C) 2003-2004 Joe Pham <djpham@netzero.com> 0004 ### 0005 ### This program is free software; you can redistribute it and/or modify 0006 ### it under the terms of the BitPim license as detailed in the LICENSE file. 0007 ### 0008 ### $Id: bptime.py 3620 2006-10-20 03:50:58Z djpham $ 0009 0010 """ Module to handle BITPIM date & time """ 0011 0012 import calendar 0013 import datetime 0014 import time 0015 0016 class BPTime(object): 0017 def __init__(self, v=None): 0018 self._date=self._time=None 0019 # I guess this is how python handles overloading ctors 0020 if isinstance(v, (str, unicode)): 0021 self.set_iso_str(v) 0022 elif isinstance(v, (tuple, list)): 0023 self.set(v) 0024 elif isinstance(v, datetime.date): 0025 self._date=v 0026 0027 def _get_date(self): 0028 return self._date 0029 date=property(fget=_get_date) 0030 def _get_time(self): 0031 return self._time 0032 time=property(fget=_get_time) 0033 0034 def __sub__(self, rhs): 0035 if not isinstance(rhs, BPTime): 0036 raise TypeError 0037 return datetime.datetime(*self.get())-datetime.datetime(*rhs.get()) 0038 def __add__(self, rhs): 0039 if isinstance(rhs, int): 0040 dt=datetime.datetime(*self.get())+datetime.timedelta(seconds=rhs) 0041 elif isinstance(rhs, datetime.timedelta): 0042 dt=datetime.datetime(*self.get())+rhs 0043 else: 0044 raise TypeError 0045 return BPTime((dt.year, dt.month, dt.day, dt.hour, dt.minute)) 0046 def __eq__(self, rhs): 0047 if isinstance(rhs, BPTime): 0048 return self.date==rhs.date 0049 return False 0050 def __ne__(self, rhs): 0051 if isinstance(rhs, BPTime): 0052 return self.date!=rhs.date 0053 return False 0054 def __lt__(self, rhs): 0055 if isinstance(rhs, BPTime): 0056 return self.date<rhs.date 0057 return False 0058 def __le__(self, rhs): 0059 if isinstance(rhs, BPTime): 0060 return self.date<=rhs.date 0061 return False 0062 def __gt__(self, rhs): 0063 if isinstance(rhs, BPTime): 0064 return self.date>rhs.date 0065 return False 0066 def __ge__(self, rhs): 0067 if isinstance(rhs, BPTime): 0068 return self.date>=rhs.date 0069 return False 0070 0071 def _utc_to_local(self, offset_str=None): 0072 # convert from utc time to local time 0073 if self._date is None or self._time is None: 0074 return 0075 gmt=calendar.timegm((self._date.year, self._date.month, self._date.day, 0076 self._time.hour, self._time.minute, 0)) 0077 if offset_str is not None: 0078 # need to apply offset 0079 offset_sec=int(offset_str[1:3])*3600.0+int(offset_str[3:5])*60.0 0080 if offset_str[0]=='-': 0081 gmt+=offset_sec 0082 else: 0083 gmt-=offset_sec 0084 dt=datetime.datetime.fromtimestamp(gmt) 0085 self._date=dt.date() 0086 self._time=dt.time() 0087 def set_iso_str(self, v): 0088 # set the date/time according to the ISO string 0089 # acceptable formats: 0090 # YYYYMMDD, YYYYMMDDThhmm, YYYYMMDDThhmmss, YYYYMMDDThhmmssZ, 0091 # YYYYMMDDThhmmss+hhmm, YYYYMMDDThhmmss-hhmm 0092 v=str(v) 0093 len_v=len(v) 0094 if len_v<8: 0095 # not long enough even for the date 0096 return 0097 # date componebt 0098 self._date=datetime.date(int(v[:4]), int(v[4:6]), int(v[6:8])) 0099 self._time=None 0100 if len_v>12: 0101 # time component specified 0102 self._time=datetime.time(hour=int(v[9:11]), minute=int(v[11:13])) 0103 # check if timezone info is specified 0104 if v[-1]=='Z': 0105 # UTC time 0106 self._utc_to_local() 0107 elif v[-5]=='-' or v[-5]=='+': 0108 self._utc_to_local(v[-5:]) 0109 0110 def iso_str(self, no_time=False, no_seconds=True): 0111 # return an ISO string representation 0112 s='' 0113 if self._date is not None: 0114 s='%04d%02d%02d'%(self._date.year, self._date.month, 0115 self._date.day) 0116 if self._time is not None and not no_time: 0117 s+='T%02d%02d'%(self._time.hour, self._time.minute) 0118 if not no_seconds: 0119 s+='00' 0120 return s 0121 0122 def date_str(self): 0123 if self._date is None: 0124 s='' 0125 else: 0126 s='%04d-%02d-%02d'%(self._date.year, self._date.month, 0127 self._date.day) 0128 return s 0129 0130 def time_str(self, am_pm=True, default=''): 0131 if self._time is None: 0132 s=default 0133 else: 0134 h=self._time.hour 0135 if am_pm: 0136 if h>11: 0137 ampm_str='pm' 0138 else: 0139 ampm_str='am' 0140 if h>12: 0141 h-=12 0142 s='%02d:%02d%s'%(h, self._time.minute, ampm_str) 0143 else: 0144 s='%02d:%02d'%(h, self._time.minute) 0145 return s 0146 0147 def get(self, default=(0,0,0,0,0)): 0148 if self._date is None: 0149 t=default[:3] 0150 else: 0151 t=(self._date.year, self._date.month, self._date.day) 0152 if self._time is None: 0153 t+=default[3:5] 0154 else: 0155 t+=(self._time.hour, self._time.minute) 0156 return t 0157 0158 def set(self, v): 0159 self._date=self._time=None 0160 if len(v)>2: 0161 self._date=datetime.date(*v[:3]) 0162 if len(v)==5: 0163 self._time=datetime.time(*v[3:]) 0164 0165 def mktime(self): 0166 # return a float compatible with time.time() 0167 return time.mktime(datetime.datetime.combine(self._date, self._time).timetuple()) 0168
Generated by PyXR 0.9.4