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中实现点击图片链接强制直接下载的方法
May 14 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
利用ctypes提高Python的执行速度
Sep 09 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
一篇文章快速了解Python的GIL
Jan 12 Python
python正则中最短匹配实现代码
Jan 16 Python
用Python将mysql数据导出成json的方法
Aug 21 Python
Python中collections模块的基本使用教程
Dec 07 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 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 获取本地IP代码
2013/06/23 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
php文件上传的两种实现方法
2016/04/04 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
Javascript 面向对象之重载
2010/05/04 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
python计算文本文件行数的方法
2015/07/06 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
python复合条件下的字典排序
2020/12/18 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
行政经理岗位职责
2013/11/09 职场文书
服装设计行业个人的自我评价
2013/12/20 职场文书
体育运动口号
2014/06/09 职场文书
依法行政工作汇报
2014/10/28 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
前端JavaScript大管家 package.json
2021/11/02 Javascript