PyXR

c:\projects\bitpim\src \ bptime.py



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