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中使用enumerate函数遍历元素实例
Jun 16 Python
分享几道你可能遇到的python面试题
Jul 24 Python
dataframe设置两个条件取值的实例
Apr 12 Python
python xpath获取页面注释的方法
Jan 14 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
python将unicode和str互相转化的实现
May 11 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
python中wheel的用法整理
Jun 15 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 Python
基于Python实现的购物商城管理系统
Apr 27 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实现和c#一致的DES加密解密实例
2017/07/24 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python dlib人脸识别代码实例
2019/04/04 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
500行python代码实现飞机大战
2020/04/24 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
公司企业表扬信
2014/01/11 职场文书
社区交通安全实施方案
2014/03/22 职场文书
调解协议书
2014/04/16 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers