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绘制人人网好友关系图示例
Apr 01 Python
用Python进行基础的函数式编程的教程
Mar 31 Python
Python信息抽取之乱码解决办法
Jun 29 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
详解django中url路由配置及渲染方式
Feb 25 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
Python发送邮件实现基础解析
Aug 14 Python
Django REST Framework 分页(Pagination)详解
Nov 30 Python
关于python中模块和重载的问题
Nov 02 Python
python中filter,map,reduce的作用
Jun 10 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得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
Python 修改列表中的元素方法
2018/06/26 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
python版百度语音识别功能
2019/07/09 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
详解如何减少python内存的消耗
2019/08/09 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
大学生专科毕业生自我评价
2013/11/17 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
环保小标语
2014/06/13 职场文书
经理助理岗位职责
2015/02/02 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
Java后台生成图片的完整步骤
2021/08/04 Java/Android
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android