一、convert_helper.py
在common文件夹下面建立convert_helper.py文件。
convert_helper.py是类型转换包,所有字符串转数值、字符串转日期、字符串日期转时间戳等各种类型转换函数,都可以放到这里来。
#!/usr/bin/evn python # coding=utf-8 import decimal import datetime ############################################# # 数值型转换函数 ############################################# def to_int(text): """将字符串安全转换为int类型,转换失败时默认值为0""" try: return int(text) except: return 0 def to_int0(text): """将字符串安全转换为int类型,当int值小于0时,返回0""" result = to_int(text) # 判断转换后的结果值是否小于0,是的话返回0 if not result or result < 0: return 0 else: return result def to_int1(text): """将字符串安全转换为int类型,当int值小于1时,返回1""" result = to_int(text) # 判断转换后的结果值是否小于1,是的话返回1 if not result or result < 1: return 1 else: return result def to_float(text): """将字符串安全转换为float类型""" try: return float(text) except: return 0.0 def to_decimal(text): """将字符串安全转换为int类型""" try: return decimal.Decimal(text) except: return 0 ############################################# # 日期型转换函数 ############################################# def to_datetime(text): """字符串转时间""" if not text: return None # 定义字典根据时间字符串匹配不同的格式 time_dict = { 1: "%Y-%m-%d %H:%M:%S.%f", 2: "%Y-%m-%d %H:%M", 3: "%Y-%m-%d %H:%M:%S", } # 如果中间含有时间部分就用:判断 try: if str(text).find('.') > -1: return datetime.datetime.strptime(text, time_dict[1]) elif ':' in text: time_list = text.split(':') return datetime.datetime.strptime(text, time_dict[len(time_list)]) else: return datetime.datetime.strptime(text, "%Y-%m-%d") except: return None def to_date(text): """字符串转日期""" d = to_datetime(text) if d: return d.date() def to_timestamp10(text): """将时间格式的字符串转化为长度为10位长度的时间戳""" d = to_datetime(text) if d: return int(d.timestamp()) else: return 0 def to_timestamp13(text): """将时间格式的字符串转化为长度为13位长度的时间戳""" d = to_datetime(text) if d: return int(d.timestamp() * 1000) else: return 0
比如说字符转int函数
def to_int(text): """将字符串安全转换为int类型,转换失败时默认值为0""" try: return int(text) except: return 0
在日常使用当中,经常会要求数值不能小于0或小于1,而to_int()函数转换时,用户如果输入了负数,虽然转换成功了,但这个值却不是我们想要的结果,如果每次都要加上一段代码对值进行判断,那会更加麻烦,所以进行了再次封装,多出来to_int0()和to_int()1两个函数。
def to_int0(text): """将字符串安全转换为int类型,当int值小于0时,返回0""" result = to_int(text) # 判断转换后的结果值是否小于0,是的话返回0 if not result or result < 0: return 0 else: return result def to_int1(text): """将字符串安全转换为int类型,当int值小于1时,返回1""" result = to_int(text) # 判断转换后的结果值是否小于1,是的话返回1 if not result or result < 1: return 1 else: return result
to_datetime()函数,会根据输入的日期字符串格式,转换成对应的日期(如:2017-09-01)、日期时间(2017-09-01 11:11)、日期时分秒(2017-09-01 11:11:11)、日期时分秒毫秒类型(2017-09-01 11:11:11.111),得到的值是datetime类型
def test_to_datetime(self): print('---test_to_datetime---') print(convert_helper.to_datetime(None)) print(convert_helper.to_datetime('')) print(convert_helper.to_datetime('xxx')) print(convert_helper.to_datetime('2017-09-01')) print(convert_helper.to_datetime('2017-09-01 11:11')) print(convert_helper.to_datetime('2017-09-0111:11')) print(convert_helper.to_datetime('2017-09-01 11:11:11')) print(convert_helper.to_datetime('2017-09-01 11:11:11.111'))
二、datetime_helper.py
这个日期函数操作包,这个包里的函数类型主要有两大类,一种是日期类型转换,将日期类型格式化为字符串类型或转换为数值类型;另一种是对日期类型的比较或运算。
#!/usr/bin/evn python # coding=utf-8 import time import datetime def to_date(dt): """将时间格式化为日期字符串""" if isinstance(dt, datetime.datetime): return dt.strftime('%Y-%m-%d') elif isinstance(dt, datetime.date): return dt.strftime('%Y-%m-%d') else: raise Exception("日期类型错误") def to_datetime(dt): """将时间格式化为日期时间字符串""" if isinstance(dt, datetime.datetime): return dt.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(dt, datetime.date): return dt.strftime('%Y-%m-%d') else: raise Exception("日期类型错误") def to_number(): """当前时间转换为年月日时分秒毫秒共10位数的字符串""" return datetime.datetime.now().strftime('%Y%m%d%H%M%S') def to_timestamp10(): """获取当前时间长度为10位长度的时间戳""" return int(time.time()) def to_timestamp13(): """获取当前时间长度为13位长度的时间戳""" return int(time.time() * 1000) def timedelta(sign, dt, value): """ 对指定时间进行加减运算,几秒、几分、几小时、几日、几周、几月、几年 sign: y = 年, m = 月, w = 周, d = 日, h = 时, n = 分钟, s = 秒 dt: 日期,只能是datetime或datetime.date类型 value: 加减的数值 return: 返回运算后的datetime类型值 """ if not isinstance(dt, datetime.datetime) and not isinstance(dt, datetime.date): raise Exception("日期类型错误") if sign == 'y': year = dt.year + value if isinstance(dt, datetime.date): return datetime.datetime(year, dt.month, dt.day) elif isinstance(dt, datetime.datetime): return datetime.datetime(year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond) else: return None elif sign == 'm': year = dt.year month = dt.month + value ### 如果月份加减后超出范围,则需要计算一下,对年份进行处理 ### # 如果月份加减后等于0时,需要特殊处理一下 if month == 0: year = year - 1 month = 12 else: # 对年月进行处理 year = year + month // 12 month = month % 12 if isinstance(dt, datetime.date): return datetime.datetime(year, month, dt.day) elif isinstance(dt, datetime.datetime): return datetime.datetime(year, month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond) else: return None elif sign == 'w': delta = datetime.timedelta(weeks=value) elif sign == 'd': delta = datetime.timedelta(days=value) elif sign == 'h': delta = datetime.timedelta(hours=value) elif sign == 'n': delta = datetime.timedelta(minutes=value) elif sign == 's': delta = datetime.timedelta(seconds=value) else: return None return dt + delta
to开头的函数都是时间类型转换函数(PS:convert_helper.py包里是对日期格式字符串转为时间类型,而datetime_helper.py里所有操作,都是对时间类型进行处理的,将它们转为其他格式)