python非标准时间的转换

作者:black manba 时间:2022-04-12 17:37: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 | 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', ''))

来源:https://blog.csdn.net/weixin_42156283/article/details/119066040

标签:python,非标准时间
0
投稿

猜你喜欢

  • 如何判断用户是否非正常离开聊天室?

    2010-01-18 20:30:00
  • Python drop()删除行列的操作方法

    2022-10-27 17:12:41
  • 新 API 寻求让 JavaScript 操作本地文件

    2009-11-27 18:28:00
  • 未将对象引用设置到对象的实例 (System.NullReferenceException)

    2023-06-27 10:46:53
  • asp如何创建Word 文件?

    2009-11-14 20:47:00
  • SQL Server 2005数据库镜像配置脚本示例

    2008-04-12 14:49:00
  • 如何利用Python动态模拟太阳系运转

    2022-01-14 15:01:43
  • Python计算素数个数的两种方法

    2023-09-09 16:38:19
  • python根据用户需求输入想爬取的内容及页数爬取图片方法详解

    2022-12-21 16:31:19
  • 如何使数据库的ID字段自动加1?

    2010-06-03 10:47:00
  • python必学知识之文件操作(建议收藏)

    2021-10-01 16:28:25
  • Python和php通信乱码问题解决方法

    2023-03-04 14:50:43
  • Go语言中defer语句的用法

    2023-07-07 11:04:17
  • Python特效之文字成像方法详解

    2021-08-09 09:34:06
  • Python采集C站热榜数据实战示例

    2022-05-03 13:13:13
  • 17个javascript自定义函数库

    2008-02-26 11:49:00
  • python正则表达式中匹配次数与贪心问题详解(+ ?*)

    2021-04-24 20:52:04
  • Python3 venv搭建轻量级虚拟环境的步骤(图文)

    2022-11-26 08:47:16
  • python用match()函数爬数据方法详解

    2023-07-27 12:52:48
  • php获取文章内容第一张图片的方法示例

    2023-11-09 18:55:14
  • asp之家 网络编程 m.aspxhome.com