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利用matplotlib库绘制饼图的方法示例
Dec 18 Python
详解Python中for循环是如何工作的
Jun 30 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
python3正则提取字符串里的中文实例
Jan 31 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
python 实现两个线程交替执行
May 02 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 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
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
php单一接口的实现方法
2015/06/20 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
简化Python的Django框架代码的一些示例
2015/04/20 Python
在centos7中分布式部署pyspider
2017/05/03 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
如何给Python代码进行加密
2020/01/10 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
中医临床专业自我鉴定范文
2014/01/15 职场文书
优秀干部获奖感言
2014/01/31 职场文书
市场总经理岗位职责
2014/04/11 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
活动总结格式
2014/08/30 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
nginx请求限制配置方法
2021/07/09 Servers
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript