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和php通信乱码问题解决方法
Apr 15 Python
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
详解Python安装scrapy的正确姿势
Jun 26 Python
Python爬虫使用脚本登录Github并查看信息
Jul 16 Python
python开发游戏的前期准备
May 05 Python
Python实现时间序列可视化的方法
Aug 06 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
react build 后打包发布总结
2018/08/24 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现linux下使用xcopy的方法
2015/06/28 Python
Python中random模块生成随机数详解
2016/03/10 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
Python sys模块常用方法解析
2020/02/20 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
金融行业职业生涯规划范文
2014/01/17 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
英语教师求职信
2014/06/16 职场文书
民主生活会发言材料
2014/10/20 职场文书
复试通知单模板
2015/04/24 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
Python中Cookies导出某站用户数据的方法
2021/05/17 Python