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实现带百分比的进度条
Jun 28 Python
简单谈谈python中的多进程
Nov 06 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
Python测试线程应用程序过程解析
Dec 31 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 Python
python自动化之如何利用allure生成测试报告
May 02 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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 IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
php字符串分割函数用法实例
2015/03/17 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
php读取本地json文件的实例
2018/03/07 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
Python正则捕获操作示例
2017/08/19 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
公司股权转让协议书
2014/04/12 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
一级电子管军用接收机测评
2022/04/05 无线电