我正在開發一個程式,它可以獲得一個對人友好的輸入,并將其轉換為unix時間(即從1970年1月1日午夜開始的秒數)。
2030y1.html2030y1d4M。2030年4月1日的午夜 。2030y1d4M5m:2030年4月1日00:05 。6h1d4M:當年4月1日06:00
基本上,用戶將以任意的順序輸入一些或所有的單位。
我曾尋找過類似的問題,并找到了一些將單位轉換為時間的外部網站。然而,沒有一個網站提出了將其轉換為資料時間物件的方法。strptime太嚴格了,而且(似乎)不允許有不同的順序
不管是轉換為datetime.datetime物件,然后再轉換為unix時間,還是直接轉換為unix時間,都沒有關系。我可能不需要確切的代碼,但我很高興被指出正確的方向。
uj5u.com熱心網友回復:
你可以使用一個regex來決議用戶輸入的資訊:
import re
import datetime as dt
userDate = '6h2030y1d4M5m'/span>
# Use reg ex to parse user input
dateParts = {
m[-1]。int(m[:-1])
for m in re.findall(r'([d]{1,4}[ydhmM]{1})'/span>, userDate)
}
now = dt.datetime.now()
# construct datetime obj, use datetime.now() as default for the case values are missing in user string。
dObj = dt.datetime(
dateParts.get('y', now.year), dateParts.get('m', now.month)。
dateParts.get('d'/span>, now.day), dateParts.get('h', now.hour)。
dateParts.get('M'/span>, now.minute), dateParts.get('s'/span>, now.second)
)
print(dObj)
輸出:
203005-01 06:04:35
uj5u.com熱心網友回復:
你肯定需要的是tokenize你的輸入。考慮到你的輸入例子,它應該可以通過正則運算式進行標記,請考慮以下例子
import re
def tokenize(x)。
return re.findall(r'(d )(D )', x)
d1 = "2030y1d4M"。
d2 = "2030y1d4M5m"/span>
d3 = "6h1d4M"/span>
print(tokenize(d1))
print(tokenize(d2))
print(tokenize(d3))
輸出
[('2030', 'y'), ('1', 'd'), ('4', 'M') ]
[('2030', 'y'), ('1', 'd') 。('4', 'M'), ('5', 'm') ]
[('6', 'h'), ('1', 'd'), ('4', 'M') ]
解釋:函式tokenize將輸入的字串轉換成包含值(如字串)和單位(也是字串)的2元組串列。但是要注意的是,這個函式假設用戶輸入的是某些喬姆斯基第三類語言的專案,如果這一點不成立的話,正則運算式就不夠用了。
uj5u.com熱心網友回復:
定義符號和它們的含義,例如:y代表year。然后使用regex,決議字串以查看每個單位,例如:[('2030', 'y'), ('1', 'd'), ('4', 'M')]。使用這兩個資料,我們已經可以構建一個資料時間物件。
from datetime import datetime, MINYEAR
import re
UNITS = {
"y": "年",
"M": "月"。
"d": "day"。
"h": "小時"。
"m": "minute"。
}
dt_re = re.compile(r" (d )([A-Za-z])")
for text_date in [
"2030y1d4M"。
"2030y1d4M5m"。
"6h1d4M"。
"23h1993y59m25d12M",
]:
unit_list = dt_re.findall(text_date)
dt_kwargs = {"year": MINYEAR, "month": 1, "day": 1},"day": 1}。 # 所需引數的默認值。
for unit in unit_list:
dt_kwargs[UNITS[unit[1]]] = int(unit[0] )
dt = datetime(**dt_kwargs)
print(dt)
輸出
2030-04-01 00:00:00
2030-04-01 00: 05:00
0001-04-01 06:00:00
1993-12-25 23:59:00。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/311891.html
標籤:
