Python 日期操作
来源:互联网 发布:壳氏唯切菜板知乎 编辑:程序博客网 时间:2024/06/06 02:42
1、前言
python 日期操作包括时间戳转换、日期格式转换、日期排序、相对时间加减等。开发中发现这部分工作经常涉及,代码重复利用率高。所以基于python time包、datetime包、dateuitl包、还有其他实现的代码,总结一些关于日期的常用操作,也希望对其他同学有帮助。
2、代码
# coding=utf8import refrom collections import OrderedDictfrom dateutil.parser import parseimport datetimeimport timeclass 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 Falseif __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
- Python日期操作笔记
- Python日期操作笔记
- Python日期操作笔记
- python日期操作
- Python学习---日期操作
- Python日期操作
- python日期操作
- Python日期操作
- Python日期操作
- Python日期操作
- Python日期操作
- Python日期操作
- python日期操作
- python日期操作
- python时间日期操作
- python日期操作
- python日期操作
- python日期格式化操作
- [PAT-乙级]1022.D进制的A+B
- PAT天梯赛 5-20 稳赢
- 如何用netstat命令查看windows系统端口占用问题的技巧
- 云计算基础
- ROS之pluginlib详解
- Python 日期操作
- am335x i2c_max7359-IC按键与旋钮驱动
- 基于多旋翼飞行器的高压线巡检机器人
- activemq管理
- Java中多线程并发体系知识点汇总
- [PAT-乙级]1023.组个最小数
- RTEMS Doxygen编写规范
- activemq优化
- activemq--MASTER SLAVE+BROKER CLUSTER 实践(一)