一、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里所有操作,都是对时间类型进行处理的,将它们转为其他格式)