• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python非标准时间的转换

    可匹配结构:

    今天~前天, 几天前, 分钟秒前等 | 2017-1-4 12:10 | 2017/1/4 12:10 | 2018年4月2日 12:12 | 2018年4月2日 | 2017-1-4 | 2017/1/4 | 1/4 |

    # -*- coding:utf-8 -*-
    from datetime import datetime, timedelta
    import re
    import time
    
    
    def tz_offset(tz):
        res = (re.search(r'(?PF>[-+])(?PH>\d{2}):?(?PM>\d{2})', tz) or re.search('', '')).groupdict()
        offset = (1 if res.get('F', '+')=='+' else -1) * timedelta(
                            hours   = int(res.get('H', 0)),
                            minutes = int(res.get('M', 0)))
        return offset
    
    
    def parse_date(data, fmt, tz):
        """
            时间匹配模块,可转化为固定格式
            返回时间字符串 0000-00-00 00:00:00
            可匹配结构 |今天~前天, 几天前,分钟秒前等 | 2017-1-4 12:10 | 2017/1/4 12:10 | 2018年4月2日 12:12
                            | 2018年4月2日 | 2017-1-4 | 2017/1/4 | 1/4 |
        """
        offset = tz_offset(tz)
        if fmt == 'auto':
            now = (datetime.utcnow() + timedelta(hours=8)).replace(microsecond=0) + offset
            now_1 = now - timedelta(days=1)
            now_2 = now - timedelta(days=2)
    
            # 几/刚/今天/昨天/前天
            x = data.strip()
            x = x.replace(u'几', ' 0 ')
            x = x.replace(u'刚[刚才]', now.strftime(' %Y-%m-%d %H:%M:%S '))
            x = x.replace(u'今天', now.strftime(' %Y-%m-%d '))
            x = x.replace(u'昨天', now_1.strftime(' %Y-%m-%d '))
            x = x.replace(u'前天', now_2.strftime(' %Y-%m-%d '))
            x = re.sub(r'[年月]', '/', x)
            x = re.sub(r'[日]', ' ', x)
            x = re.sub(r'\s{2,}', r' ', x)
    
            # XX前
            res = (re.search(r'(?PS>\d+)\s*秒钟?前', x) \
    
                   or re.search(r'(?PM>\d+)\s*分钟前', x) \
    
                   or re.search(r'(?PH>\d+)\s*小时前', x) \
    
                   or re.search(r'(?Pd>\d+)\s*天前', x) \
    
                   or re.search('', '')).groupdict()
            if res:
                dt = now - timedelta(
                    days=int(res.get('d', 0)),
                    hours=int(res.get('H', 0)),
                    minutes=int(res.get('M', 0)),
                    seconds=int(res.get('S', 0))
                )
            # 不是几天前分钟前的形式
            else:
                # XX-XX-XX XX:XX:XX
                res = (re.search(r'(?PY>\d+)[/-](?Pm>\d+)[/-](?Pd>\d+)(\s+(?PH>\d{1,2}):(?PM>\d{2})(:(?PS>\d{2}))?)?',
                                 x) or re.search('', '')).groupdict()
                if res == dict():
                    # 匹配没有年份的时候,格式 XX-XX XX:XX:XX  月-日 时:分:秒 或 17年10月10日 时:分:秒
                    res = (re.search(
                        r'(?Pm>\d{1,2})[/-](?Pd>\d+)(\s+(?PH>\d{2}):(?PM>\d{2})(:(?PS>\d{2}))?)?',
                        x) or re.search('', '')).groupdict()
                if res:
                    Y = res.get('Y', now.year)
                    Y = "20" + Y if len(str(Y)) == 2 else Y
                    m = res.get('m', now.month)
                    d = res.get('d', now.day)
                    H = res.get('H', now.hour)
                    M = res.get('M', now.minute)
                    S = res.get('S', 0)
                    dt = datetime(
                        year=int(Y) if Y != None and 1987 = int(Y) = now.year else now.year,
                        month=int(m) if m != None else now.month,
                        day=int(d) if d != None else now.day,
                        # 如果没有时分秒,则被认定为00:00:00
                        hour=int(H) if H != None else 0,
                        minute=int(M) if M != None else 0,
                        second=int(S) if S != None else 0
                    )
                else:
                    # 1970-01-01 00:00:00
                    # dt = datetime.utcfromtimestamp(0)+offset
                    return ""
            # 时间可能超过当前时间,若超过则减去一年
            if int(time.mktime((dt - offset).timetuple())) > int(time.time()):
                # 时间超过当前时间,减去一年
                delta = timedelta(days=-365)
                real_time = (dt - offset) + delta
                real_time = real_time.strftime("%Y-%m-%d %H:%M:%S")
            else:
                real_time = (dt - offset).strftime("%Y-%m-%d %H:%M:%S")
            return real_time
    
    
    if __name__ == '__main__':
        print(parse_date('2秒前', 'auto', ''))
        print(parse_date('2分钟前', 'auto', ''))
        print(parse_date('2小时前', 'auto', ''))
        print(parse_date('昨天 00:30', 'auto', ''))
        print(parse_date('07-20', 'auto', ''))

    到此这篇关于python非标准时间的转换的文章就介绍到这了,更多相关python非标准时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • ROS系统将python包编译为可执行文件的简单步骤
    • Python中rapidjson参数校验实现
    • Python中scrapy下载保存图片的示例
    • Python动态规划实现虚拟机部署的算法思想
    • python 多线程实现多任务的方法示例
    • python方差检验的含义及用法
    • Python函数实现学员管理系统
    • python调试模式无响应解决案例
    上一篇:python之json文件转xml文件案例讲解
    下一篇:pandas数值排序的实现实例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python非标准时间的转换 python,非,标准时,间的,转换,