python非標準時間的轉(zhuǎn)換
可匹配結(jié)構(gòu):
今天~前天, 幾天前, 分鐘秒前等 | 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):
"""
時間匹配模塊,可轉(zhuǎn)化為固定格式
返回時間字符串 0000-00-00 00:00:00
可匹配結(jié)構(gòu) |今天~前天, 幾天前,分鐘秒前等 | 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 ""
# 時間可能超過當(dāng)前時間,若超過則減去一年
if int(time.mktime((dt - offset).timetuple())) > int(time.time()):
# 時間超過當(dāng)前時間,減去一年
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', ''))
到此這篇關(guān)于python非標準時間的轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)python非標準時間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python構(gòu)建Hopfield網(wǎng)絡(luò)的教程
這篇文章主要介紹了使用Python構(gòu)建Hopfield網(wǎng)絡(luò)的教程,本文來自于IBM官方網(wǎng)站的技術(shù)文檔,需要的朋友可以參考下2015-04-04
django authenticate用戶身份認證的項目實踐
Django的contrib.auth模塊中的authenticate()函數(shù)用于對用戶的憑據(jù)進行身份驗證,本文就來介紹一下django authenticate用戶身份認證的使用,具有一定的參考價值,感興趣的可以了解一下2023-08-08
python 3利用Dlib 19.7實現(xiàn)攝像頭人臉檢測特征點標定
這篇文章主要為大家詳細介紹了python 3利用Dlib 19.7實現(xiàn)攝像頭人臉檢測特征點標定,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
Python連接到PostgreSQL數(shù)據(jù)庫的方法詳解
顧名思義,PostgreSQL?是一款為高效管理數(shù)據(jù)庫系統(tǒng)而創(chuàng)建的?SQL?系統(tǒng)軟件,這篇文章主要為大家詳細介紹了創(chuàng)建與?PostgreSQL?上的數(shù)據(jù)庫的連接的過程,需要的小伙伴可以了解下2023-10-10
Tensorflow中tf.ConfigProto()的用法詳解
今天小編就為大家分享一篇Tensorflow中tf.ConfigProto()的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

