- #!/usr/bin/python
- # encoding: utf-8
- #
- # filename: datetimetools.py
- """通过识别提供的参数的类型,实现的各种"日期时间"数据格式的转换工具
- 日期时间的数据格式包括:
- timestamp (unix time, seconds from 1970-1-1 0:00:00),
- time.struct_time (C 语言中的时间结构)
- datetime.datetime
- datetime.date
- """
- import time
- import datetime
- DATETIMEBASE = datetime.datetime(1970, 1, 1)
- DT_DAY = datetime.timedelta(days=1)
- DT_SECOND = datetime.timedelta(seconds=1)
- DT_HOUR = 3600 * DT_SECOND
- class Convertor:
- def __init__(self,
- defaultfmt="%Y-%m-%d %H:%M:%S",
- tmzone=time.timezone):
- """set the default string datetime format
- and system local time zone
- """
- self.fmt = defaultfmt
- self.tmzone = tmzone
- self.srcfmt = self.fmt
- def setsrcfmt(self, fmt="%Y-%m-%d %H:%M:%S"):
- """set convert string format to be converted"""
- self.srcfmt = fmt
- def timestamp(self, obj=None):
- """return unix timestamp"""
- if obj is None:
- return time.time()
- elif isinstance(obj, datetime.datetime):
- return (obj - DATETIMEBASE).total_seconds() + self.tmzone
- elif isinstance(obj, datetime.date):
- dt = datetime.datetime(obj.year, obj.month, obj.day)
- return (dt - DATETIMEBASE).total_seconds() + self.tmzone
- elif isinstance(obj, time.struct_time):
- return time.mktime(obj)
- elif isinstance(obj, (int, float)):
- return obj
- elif isinstance(obj, str):
- return time.mktime(time.strptime(obj, self.srcfmt))
- def datetime(self, obj=None):
- """return datetime instance"""
- if obj is None:
- return datetime.datetime.now()
- elif isinstance(obj, datetime.datetime):
- return obj
- elif isinstance(obj, datetime.date):
- return datetime.datetime(obj.year, obj.month, obj.day)
- elif isinstance(obj, time.struct_time):
- return datetime.datetime(year=obj.tm_year,
- month=obj.tm_mon,
- day=obj.tm_mday,
- hour=obj.tm_hour,
- minute=obj.tm_min,
- second=obj.tm_sec)
- elif isinstance(obj, (int, float)):
- tm = time.gmtime(obj-self.tmzone)
- return datetime.datetime(year=tm.tm_year,
- month=tm.tm_mon,
- day=tm.tm_mday,
- hour=tm.tm_hour,
- minute=tm.tm_min,
- second=tm.tm_sec)
- elif isinstance(obj, str):
- tm = time.strptime(obj, self.srcfmt)
- return datetime.datetime(year=tm.tm_year,
- month=tm.tm_mon,
- day=tm.tm_mday,
- hour=tm.tm_hour,
- minute=tm.tm_min,
- second=tm.tm_sec)
- def date(self, obj=None):
- """return datetime instance"""
- if obj is None:
- return datetime.date.today()
- elif isinstance(obj, (datetime.date, datetime.datetime)):
- return datetime.date(obj.year, obj.month, obj.day)
- elif isinstance(obj, time.struct_time):
- return datetime.date(year=obj.tm_year,
- month=obj.tm_mon,
- day=obj.tm_mday)
- elif isinstance(obj, (int, float)):
- tm = time.gmtime(obj-self.tmzone)
- return datetime.date(year=tm.tm_year,
- month=tm.tm_mon,
- day=tm.tm_mday)
- elif isinstance(obj, str):
- tm = time.strptime(obj, self.srcfmt)
- return datetime.date(year=tm.tm_year,
- month=tm.tm_mon,
- day=tm.tm_mday)
- def struct_time(self, obj=None):
- """return a local time.struct_time"""
- if obj is None:
- return time.gmtime(time.time()-self.tmzone)
- elif isinstance(obj, datetime.datetime):
- tm = (obj - DATETIMEBASE).total_seconds()
- return time.gmtime(tm)
- elif isinstance(obj, datetime.date):
- tm = (datetime.datetime(obj.year, obj.month, obj.day)
- - DATETIMEBASE).total_seconds()
- return time.gmtime(tm)
- elif isinstance(obj, time.struct_time):
- return obj
- elif isinstance(obj, (int, float)):
- return time.gmtime(obj-self.tmzone)
- elif isinstance(obj, str):
- return time.strptime(obj, self.srcfmt)
- def str(self, obj=None):
- """return formated string"""
- if obj is None:
- return datetime.datetime.now().strftime(self.fmt)
- elif isinstance(obj, (datetime.date, datetime.datetime)):
- return obj.strftime(self.fmt)
- elif isinstance(obj, time.struct_time):
- return time.strftime(self.fmt, obj)
- elif isinstance(obj, (int, float)):
- return time.strftime(self.fmt, time.localtime(obj))
- elif isinstance(obj, str):
- return time.strftime(self.fmt, time.strptime(obj, self.srcfmt))
- def tester():
- dct = Convertor()
- dt = dct.datetime()
- tm = dct.timestamp()
- st = dct.struct_time()
- sr = dct.str()
- _D = dct.date()
- print '%r' % tm
- print '%r' % dct.timestamp(dt)
- print '%r' % dct.timestamp(tm)
- print '%r' % dct.timestamp(st)
- print '%r' % dct.timestamp(sr)
- print '%r' % dct.timestamp(_D)
- print '%r' % dt
- print '%r' % dct.datetime(dt)
- print '%r' % dct.datetime(tm)
- print '%r' % dct.datetime(st)
- print '%r' % dct.datetime(sr)
- print '%r' % dct.datetime(_D)
- print '%r' % st
- print '%r' % dct.struct_time(dt)
- print '%r' % dct.struct_time(tm)
- print '%r' % dct.struct_time(st)
- print '%r' % dct.struct_time(sr)
- print '%r' % dct.struct_time(_D)
- dct.setsrcfmt('%Y%m%d%H%M%S')
- sr = '20130705123245'
- print '%r' % sr
- print '%r' % dct.str(dt)
- print '%r' % dct.str(tm)
- print '%r' % dct.str(st)
- print '%r' % dct.str(sr)
- print '%r' % dct.str(_D)
- print '%r' % _D
- print '%r' % dct.date(dt)
- print '%r' % dct.date(tm)
- print '%r' % dct.date(st)
- print '%r' % dct.date(sr)
- if __name__ == "__main__":
- tester()
- #该片段来自于http://www.codesnippet.cn/detail/221020136568.html
来源: http://www.codesnippet.cn/detail/221020136568.html