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中的random()方法的使用介绍
May 15 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
python3解析库pyquery的深入讲解
Jun 26 Python
详解Python sys.argv使用方法
May 10 Python
Python中的pathlib.Path为什么不继承str详解
Jun 23 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
tensorflow2.0保存和恢复模型3种方法
Feb 03 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
Python定时任务APScheduler原理及实例解析
May 30 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实现更新中间关联表数据的两种方法
2014/09/01 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
Python下简易的单例模式详解
2019/04/08 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
python numpy 反转 reverse示例
2019/12/04 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
美国电视购物HSN官网:HSN
2016/09/07 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
校长竞聘演讲稿
2014/05/16 职场文书
微笑服务标语
2014/06/24 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
志愿服务心得体会
2016/01/15 职场文书
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers