python非标准时间的转换


Posted in Python onJuly 25, 2021

可匹配结构:

今天~前天, 几天前, 分钟秒前等 | 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'(?P<F>[-+])(?P<H>\d{2}):?(?P<M>\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'(?P<S>\d+)\s*秒钟?前', x) \
               or re.search(r'(?P<M>\d+)\s*分钟前', x) \
               or re.search(r'(?P<H>\d+)\s*小时前', x) \
               or re.search(r'(?P<d>\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'(?P<Y>\d+)[/-](?P<m>\d+)[/-](?P<d>\d+)(\s+(?P<H>\d{1,2}):(?P<M>\d{2})(:(?P<S>\d{2}))?)?',
                             x) or re.search('', '')).groupdict()
            if res == dict():
                # 匹配没有年份的时候,格式 XX-XX XX:XX:XX  月-日 时:分:秒 或 17年10月10日 时:分:秒
                res = (re.search(
                    r'(?P<m>\d{1,2})[/-](?P<d>\d+)(\s+(?P<H>\d{2}):(?P<M>\d{2})(:(?P<S>\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非标准时间内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的包管理器pip更换软件源的方法详解
Jun 20 Python
Django基础之Model操作步骤(介绍)
May 27 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
python opencv 图像尺寸变换方法
Apr 02 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
深入了解python列表(LIST)
Jun 08 Python
Python json格式化打印实现过程解析
Jul 21 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 Python
virtualenv隔离Python环境的问题解析
Jun 21 Python
OpenCV 图像梯度的实现方法
Jul 25 #Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 #Python
Pandas自定义选项option设置
Jul 25 #Python
Pandas 稀疏数据结构的实现
Jul 25 #Python
Python中rapidjson参数校验实现
Jul 25 #Python
理解python中装饰器的作用
Jul 21 #Python
opencv检测动态物体的实现
You might like
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php生成zip文件类实例
2015/04/07 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
2009/10/25 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
Python中使用PDB库调试程序
2015/04/05 Python
详解K-means算法在Python中的实现
2017/12/05 Python
python实战之实现excel读取、统计、写入的示例讲解
2018/05/02 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
java关于string最常出现的面试题整理
2021/01/18 Python
HTTP状态码详解
2021/03/18 杂记
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
腾讯广告词
2014/03/19 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
Elasticsearch 数据类型及管理
2022/04/19 Python