欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python非标准时间的转换

程序员文章站 2022-03-16 20:05:52
可匹配结构:今天~前天, 几天前, 分钟秒前等 | 2017-1-4 12:10 | 2017/1/4 12:10 | 2018年4月2日 12:12 | 2018年4月2日 | 2017-1-4 |...

可匹配结构:

今天~前天, 几天前, 分钟秒前等 | 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非标准时间内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!