1、前言
python 日期操作包括时间戳转换、日期格式转换、日期排序、相对时间加减等。开发中发现这部分工作经常涉及,代码重复利用率高。所以基于python time包、datetime包、dateuitl包、还有其他实现的代码,总结一些关于日期的常用操作,也希望对其他同学有帮助。
2、代码
# coding=utf8
import re
from collections import OrderedDict
from dateutil.parser import parse
import datetime
import time
class DateType(object):
YMD = '%Y-%m-%d'
YMD_HMS = '%Y-%m-%d %H:%M:%S'
class DateParser(object):
"""
日期型转为字符串的函数为: datetime.datetime.strftime();
字符串转为日期型的函数为: datetime.datetime.strptime()
"""
def __init__(self):
self.pattern = re.compile(
r"((?:19|20)?\d{2})[-.]?((?:[0-1]?|1)[0-9])[-.]?((?:[0-3]?|[1-3])[0-9])?$"
)
def __cutDate(self, date, flags):
y = date.year
m = date.month if flags[1] else 1
d = date.day if flags[2] else 1
return datetime.date(y, m, d)
def __mergeFlags(self, flags1, flags2):
l = []
length = min(len(flags1), len(flags2))
for i in range(0, length):
if flags1[i] and flags2[i]:
l.append(True)
else:
l.append(False)
return l
def parse(self, strdate):
m = self.pattern.match(strdate)
flags = [False, False, False]
if m:
matches = list(m.groups())
flags = list(map(lambda x: True if x != None else False, matches))
results = list(map(lambda x: int(x) if x != None else 1, matches))
if results[0] < 100:
if results[0] > 9:
results[0] += 1900
else:
results[0] += 2000
return datetime.date(results[0], results[1], results[2]), flags
else:
return None
def convert(self, strdate, format):
date = self.parse(strdate)
if date:
date = date[0]
return datetime.date.strftime(date, format)
else:
return None
@classmethod
def count_time(cls, start_time, date_format, end_time=datetime.datetime.now()):
"""
1. 给定日期,计算和当前日期的差距
"""
start_time = datetime.datetime.strptime(start_time, date_format)
return (end_time - start_time).days
@classmethod
def find_min_date(cls, date_list, date_format):
"""
1. 找到最小的日期
"""
min_date = datetime.datetime.strptime(date_list[0], date_format)
for date in date_list:
date = datetime.datetime.strptime(date, date_format)
if (min_date - date).days > 0:
min_date = date
return min_date.strftime(date_format)
@classmethod
def sort_date_dict(cls, date_dict, date_format, DESC=True):
"""
1. 对日期进行排序
2. 输入是字典类型。
3. 默认降序方式
"""
res_dic = sorted(date_dict.iteritems(),
key=lambda d: datetime.datetime.strptime(d[0], date_format), reverse=DESC)
dic = OrderedDict()
for res in res_dic:
dic[res[0]] = res[1]
return dic
@classmethod
def sort_date_list(cls, date_list, date_format, DESC=True):
"""
1. 对日期进行排序
2. 输入是列表类型。
3. 默认降序方式
"""
res_list = sorted(date_list, key=lambda date: datetime.datetime.strptime(date, date_format), reverse=DESC)
return res_list
@classmethod
def is_valid_date(cls, str, date_format):
"""
http://www.jb51.net/article/66014.htm
判断是否是一个有效的日期字符串
"""
try:
time.strptime(str, date_format)
return True
except:
return False
if __name__ == "__main__":
print DateParser().convert("19901", "%Y.%m")
print DateParser().sort_date_dict({'2010-04-01': '122', '2010-04-03': '2342', '2010-10-02': 'wfwe'}, DateType.YMD)
test_list1 = ['2010-04-01', '2010-04-03', '2010-04-02']
test_list2 = ['2010-04-02 00:10:00', '2010-04-03 00:00:00', '2010-04-02 00:19:10']
print DateParser().sort_date_list(test_list1, DateType.YMD)
print DateParser().sort_date_list(test_list2, DateType.YMD_HMS)
print DateParser().find_min_date(test_list1, DateType.YMD)
print DateParser().count_time('2010-04-01', DateType.YMD)
# 返回当前年、月、日
print "年:", datetime.datetime.now().year, "月:", datetime.datetime.now().month, "日:", datetime.datetime.now().day
# 两个日期的时间差
delta = datetime.datetime(2011, 1, 7) - datetime.datetime(2008, 6, 24, 8, 15)
print "天:", delta.days, "秒:", delta.seconds
# 相对时间减法
print "日期相减1天", (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime("%Y-%m-%d %H:%M:%S")
print "日期相减1小时", (datetime.datetime.now() + datetime.timedelta(hours=-1)).strftime("%Y-%m-%d %H:%M:%S")
print "日期相减1分钟", (datetime.datetime.now() + datetime.timedelta(minutes=-1)).strftime("%Y-%m-%d %H:%M:%S")
print "日期相减1秒钟", (datetime.datetime.now() + datetime.timedelta(seconds=-1)).strftime("%Y-%m-%d %H:%M:%S")
# 日期转字符串
print str(datetime.datetime(2011, 1, 7))
# TODO dateuitl 包学习
"""
dateutil 几乎可以解析人类能够理解的所有日期格式
"""
print parse('2011-01-02')
print parse('2011/01/02')
print parse('20110102')
print parse('201101')
print parse('jan 31, 10:45 PM 1997')
print parse('01/02/2011')
print parse('01/02/2011', dayfirst=True)
# 生成指定日期格式的时间,该日期时间为string
date_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print date_time
# 把指定格式的日期时间转为时间戳
timestamp = time.mktime(time.strptime(date_time, '%Y-%m-%d %H:%M:%S'))
print timestamp
print type(timestamp)
# 将时间戳转为指定格式的时间
print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))
# 判断字符串是否为指定格式的日期格式
print DateParser().is_valid_date('2010-04-01', DateType.YMD)
3、运行结果
1990.01
OrderedDict([(‘2010-10-02’, ‘wfwe’), (‘2010-04-03’, ‘2342’), (‘2010-04-01’, ‘122’)])
[‘2010-04-03’, ‘2010-04-02’, ‘2010-04-01’]
[‘2010-04-03 00:00:00’, ‘2010-04-02 00:19:10’, ‘2010-04-02 00:10:00’]
2010-04-01
2600
年: 2017 月: 5 日: 14
天: 926 秒: 56700
日期相减1天 2017-05-13 23:30:58
日期相减1小时 2017-05-14 22:30:58
日期相减1分钟 2017-05-14 23:29:58
日期相减1秒钟 2017-05-14 23:30:57
2011-01-07 00:00:00
2011-01-02 00:00:00
2011-01-02 00:00:00
2011-01-02 00:00:00
2001-11-20 00:00:00
1997-01-31 22:45:00
2011-01-02 00:00:00
2011-02-01 00:00:00
2017-05-14 23:30:58
1494775858.0