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常用函数详解
Sep 13 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
Python进阶之尾递归的用法实例
Jan 31 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
提升Python程序性能的7个习惯
Apr 14 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
python如果快速判断数字奇数偶数
Nov 13 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
python实现斗地主分牌洗牌
Jun 22 Python
django教程如何自学
Jul 31 Python
Java Unsafe类实现原理及测试代码
Sep 15 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如何解决网站大流量与高并发的问题
2011/06/25 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
浅析php变量修饰符static的使用
2013/06/28 PHP
php多文件上传下载示例分享
2014/02/20 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
PHP实现递归的三种方法
2020/07/04 PHP
js word表格动态添加代码
2010/06/07 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
Python实现线程状态监测简单示例
2018/03/28 Python
对Python 数组的切片操作详解
2018/07/02 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
python线程池如何使用
2020/05/28 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
商务会议邀请函
2014/01/09 职场文书
2014年团支书工作总结
2014/11/14 职场文书
主题班会开场白
2015/06/01 职场文书
部门主管竞聘书
2015/09/15 职场文书