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 相关文章推荐
使用Django的模版来配合字符串翻译工作
Jul 27 Python
实例Python处理XML文件的方法
Aug 31 Python
Python 获得13位unix时间戳的方法
Oct 20 Python
Python列表解析配合if else的方法
Jun 23 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
python3 mmh3安装及使用方法
Oct 09 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
Django Form设置文本框为readonly操作
Jul 03 Python
python 如何用terminal输入参数
May 25 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下将XML转换为数组
2010/01/01 PHP
php字符串过滤与替换小结
2015/01/26 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
Js apply方法详解
2017/02/16 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python实现批量下载文件
2015/05/17 Python
Python实现快速多线程ping的方法
2015/07/15 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Python图片的横坐标汉字实例
2019/12/04 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
服务标语大全
2014/06/18 职场文书
党员评议思想汇报
2014/10/08 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
庆七一活动简报
2015/07/20 职场文书
公司财务管理制度
2015/08/04 职场文书