Python不规范的日期字符串处理类


Posted in Python onJune 10, 2014

我分析了形如19920203、199203、1992.02.03、1992.02、1992-02-03、1992-02、920203时间格式特征,列出了正则表达式如下:

^((?:19|20)?\d{2})[-.]?((?:[0-1]?|1)[0-9])[-.]?((?:[0-3]?|[1-3])[0-9])?$

当然这个表达式还不是很完善,只能做简单的切割,不能判断日期的合法性,关于日期是否合法,我还是交给Python的时间功能来处理吧。

根据上面的正则表达式,我写的DateParser类如下:

import re
import datetime# ***************************************************
# *
# * Description: 非标准的日期字符串处理
# * Author: wangye  <pcn88 at hotmail dot com>
# *
# ***************************************************
class DateParser(object):
    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):
        """
        描述:时间解析方法。
        参数:strdate 要分析的时间字符串,比如目标时间类型datetime(1992, 2, 3)
              可以被解析的是下述字符串之一:
            19920203 
            199203
            1992.02.03
            1992.02
            1992-02-03
            1992-02
            920203
        返回值:
            如果成功
            元组(datetime, flags),其中datetime表示转换完成的合法时间,
        flags是标志位,表示有效位数,比如199202实际转换了年和月,日没有,
        但是本函数将默认返回1日,但是flags将表示为(True, True, False),
        前面两个True分别表示年和月被转换,最后一个False表示日没有被转换。
            如果失败
            返回None。
        """
        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))
            # results = list(map(lambda x:1 if x==None else x, results))
            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):
        """
        描述:转换日期为指定格式。
        参数:strdate 同parse方法的strdate参数。
              format Python时间格式标识,同datetime.date.strftime格式化标识。
        返回值:
            如果成功,返回指定format格式的时间字符串。
            如果失败,返回None。
        """
        date = self.parse(strdate)
        if date:
            date = date[0]
            return datetime.date.strftime(date, format)
        else:
            return None
    def compare(self, strdate1, strdate2):
        """
        描述:比较两个日期。
        参数:strdate1 和 strdate2 同parse方法的strdate参数
        返回值:
            可以是下列值之一
            -4  strdate1 无效,  strdate2 有效
            -3  strdate1 有效,  strdate2 无效
            -2  strdate1 和 strdate2 无效
            -1  strdate1 < strdate2
             0  strdate1 = strdate2
             1  strdate1 > strdate2
        """
        date1,flags1 = self.parse(strdate1)
        date2,flags2 = self.parse(strdate2)
        if date1 == None and date2 != None:
            return -4
        if date1 != None and date2 == None:
            return -3
        elif date1 == None and date2 == None:
            return -2
        flags = self.__mergeFlags(flags1, flags2)
        date1 = self.__cutDate(date1, flags)
        date2 = self.__cutDate(date2, flags)
        if date1>date2:
            return 1
        elif date1<date2:
            return -1
        else:
            return 0

下面举几个例子供大家参考:

>>> DateParser().parse("19860126")
(datetime.date(1986, 1, 26), [True, True, True])
>>> DateParser().parse("199111")
(datetime.date(1991, 11, 1), [True, True, False])
>>> DateParser().parse("1991")
(datetime.date(1919, 9, 1), [True, True, True])
>>> DateParser().parse("8511")
(datetime.date(1985, 11, 1), [True, True, False])
>>> DateParser().convert("19911101", "%Y * %m * %d")
'1991 * 11 * 01'
>>> DateParser().convert("1990.1.01", "%Y.%m.%d")
'1990.01.01'
>>> DateParser().compare("1992.2", "19922")
0
>>> DateParser().compare("1992.2", "1956.03.1")
1
Python 相关文章推荐
python创建关联数组(字典)的方法
May 04 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
对Python 数组的切片操作详解
Jul 02 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
python中的itertools的使用详解
Jan 13 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
Python3开发环境搭建详细教程
Jun 18 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 #Python
Python使用htpasswd实现基本认证授权的例子
Jun 10 #Python
python网络编程学习笔记(10):webpy框架
Jun 09 #Python
You might like
在同一窗体中使用PHP来处理多个提交任务
2008/05/08 PHP
php实现mysql封装类示例
2014/05/07 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
python中的set实现不重复的排序原理
2018/01/24 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
python实现最短路径的实例方法
2020/07/19 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
渔夫的故事教学反思
2014/02/14 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
先进员工获奖感言
2014/08/14 职场文书
无私奉献演讲稿
2014/09/04 职场文书
邀请函模板
2015/02/02 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers