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 with的用法
Aug 22 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
对python的文件内注释 help注释方法
May 23 Python
pytorch: tensor类型的构建与相互转换实例
Jul 26 Python
Python使用字典的嵌套功能详解
Feb 27 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 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实现事件机制实例分析
2015/06/26 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
extjs 为某个事件设置拦截器
2010/01/15 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
Vue响应式原理详解
2017/04/18 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
浅析python递归函数和河内塔问题
2017/04/18 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python+logging+yaml实现日志分割
2019/07/22 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python同时迭代多个序列的方法
2020/07/28 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
档案接收函
2014/01/13 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
集中整治工作方案
2014/05/01 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
无保留意见审计报告
2015/06/05 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python