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数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
web.py中调用文件夹内模板的方法
Aug 26 Python
python安装numpy和pandas的方法步骤
May 27 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
Python对接支付宝支付自实现功能
Oct 10 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
python numpy数组中的复制知识解析
Feb 03 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
python3 hdf5文件 遍历代码
May 19 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
任意位置显示html菜单
2007/02/01 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
获取body标签的两种方法
2011/10/13 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
javascript常用的设计模式
2017/02/09 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
three.js实现圆柱体
2018/12/30 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
js实现点击烟花特效
2020/10/14 Javascript
python数据分析数据标准化及离散化详解
2018/02/26 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
tensorboard显示空白的解决
2020/02/15 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
python 实现超级玛丽游戏
2020/11/25 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
部队学习十八大感言
2014/01/11 职场文书
大学生创业感言
2014/01/25 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
《学会待客》教学反思
2014/02/22 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书