12306搶票腳本開發(fā)(六)更友好的時(shí)間輸入方式


文章地址 :

12306搶票腳本開發(fā)(一)提綱
12306搶票腳本開發(fā)(二)解析火車站代號(hào)并分析查詢的HTTP請(qǐng)求
12306搶票腳本開發(fā)(三)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的查詢腳本
12306搶票腳本開發(fā)(四)完善上節(jié)課的代碼并面向?qū)ο?/a>
12306搶票腳本開發(fā)(五)更友好的使用方式
12306搶票腳本開發(fā)(六)更友好的時(shí)間輸入方式
12306搶票腳本開發(fā)(七)將前幾節(jié)課的成果結(jié)合起來實(shí)現(xiàn)一個(gè)完整的工具


簡(jiǎn)介 :

火車票購票的時(shí)候需要我們輸入火車發(fā)車的時(shí)間 , 這個(gè)時(shí)間是要精確到天的
在我們之前的分析中 , 查詢的接口使用的時(shí)間格式為 : "年-月-日" (當(dāng)月和日為一位數(shù)的時(shí)候補(bǔ)零)這樣的格式
為了能讓程序的輸入更友好 , 我們應(yīng)該考慮我們常見的時(shí)間表示都有什么 ?

1. 相對(duì)日期表示法 : 
    1.1 自然語言 : 今天/明天/后天/下個(gè)月的15日/下個(gè)月的第一個(gè)星期五...
    1.2 時(shí)間戳 : 1487892686 (精確到秒或者毫秒)
2. 絕對(duì)日期表示法
    2.1 格式一 : 2017年1月1日 / 2017年01月01日
    2.2 格式二 : 2017年1月1號(hào) / 2017年01月01號(hào)
    2.3 格式三 : 17年1月1日 / 17年01月01號(hào)
    2.4 格式四 : 2017/01/01
    2.5 格式五 : 一月一日 / 1月1日
    2.6 格式六 : 15日

對(duì)于 相對(duì)日期表示法 中的自然語言表示法的前幾個(gè) (例如 : 今天/明天/后天) 我們可以通過基于規(guī)則的匹配來獲取到用戶想要表達(dá)的真實(shí)日期
對(duì)于 相對(duì)日期表示法 中的自然語言表示法的后幾個(gè) (例如 : 下個(gè)月的15日/下個(gè)月的第一個(gè)星期五) 可能需要解析固定的語法格式 , 然后進(jìn)行一定的計(jì)算才能得出真正的日期 (這個(gè)感覺比較復(fù)雜 , 需要解析的規(guī)則也比較多 , 因此先不考慮)
對(duì)于 時(shí)間戳 這里因?yàn)樗_了 , 我們并不要求這樣高的精度 , 而且在正常的使用中 , 應(yīng)該也不會(huì)有用戶直接輸入一個(gè)時(shí)間戳來表示自己乘坐火車的時(shí)間
對(duì)于 絕對(duì)日期 這種格式 : 我們根據(jù)觀察可以發(fā)現(xiàn) , 存在如下規(guī)律 :

1. 每一種格式中都包含年月日這三個(gè)元素
2. 這三個(gè)元素之后的字符是分隔符 , 這個(gè)分隔符有兩種情況 : 
  2.1 都相同 , 例如 2017/01/01
  2.2 固定的格式 : 年 月 日 / 年 月 號(hào)
3. 有的時(shí)候 , 用戶可能會(huì)省略 年份 或者 年份和月份 , 但是 日期 并不會(huì)少 , 這種情況就表示出發(fā)日期為 當(dāng)前月份 或者 是今年

我們只需要能找到這些分隔符 , 然后用分隔符把這個(gè)表示日期的字符串分割開來再解析成為我需要的格式即可
接下來就來看看我們最終的代碼 :


代碼 :

#!/usr/bin/env python
# encoding:utf-8

import datetime
import re

def timeConvertor(content):
    # 首先判斷用戶是不是按規(guī)定格式輸入的
    if re.match(r"\d{4}-\d{2}-\d{2}", content):
        return content
    elif content == "明天":
        now = datetime.datetime.now()
        delta = datetime.timedelta(days=1)
        n_days = now + delta
        return n_days.strftime("%Y-%m-%d")
    elif content == "后天":
        now = datetime.datetime.now()
        delta = datetime.timedelta(days=2)
        n_days = now + delta
        return n_days.strftime("%Y-%m-%d")
    elif content.endswith("天后"):
        content = content.replace("天后", "")
        days = int(content)
        now = datetime.datetime.now()
        delta = datetime.timedelta(days=days)
        n_days = now + delta
        return n_days.strftime("%Y-%m-%d")
    else: # 所有其他沒有的規(guī)則都默認(rèn)查詢今天
        now = datetime.datetime.now()
        return  now.strftime("%Y-%m-%d")  

def test():
    print timeConvertor("今天")
    print timeConvertor("明天")
    print timeConvertor("后天")
    print timeConvertor("1天后")
    print timeConvertor("5天后")
    print timeConvertor("10天后")

總結(jié) :

由于時(shí)間的關(guān)系 , 本節(jié)課最終實(shí)現(xiàn)的代碼很簡(jiǎn)陋 , 而且之前分析的一些功能并沒有實(shí)現(xiàn) , 但是考慮到用戶的輸入格式錯(cuò)誤的可能性較小 , 為了提高開發(fā)效率 , 盡快能推出一款產(chǎn)品 , 因此這里只是簡(jiǎn)單地對(duì)用戶輸入的時(shí)間進(jìn)行了格式化 , 完整的格式化代碼會(huì)在整個(gè)系統(tǒng)開發(fā)完成后再進(jìn)行改進(jìn)


運(yùn)行效果 :

Paste_Image.png

參考資料 :

[ Python 日期和時(shí)間 ]


預(yù)告 :

下節(jié)課我們會(huì)結(jié)合之前所有課程的經(jīng)驗(yàn) , 將之前課程的所有代碼整合起來 , 實(shí)現(xiàn)一個(gè)可以正常使用的查票引擎
用戶可以使用命令行參數(shù)來輸入 :

1. 出發(fā)時(shí)間 (根據(jù)這節(jié)課的腳本實(shí)現(xiàn))
2. 出發(fā)地
3. 目的地

然后程序就會(huì)自動(dòng)去請(qǐng)求 12306 的數(shù)據(jù)接口 , 得到數(shù)據(jù)后再格式化顯示出來

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氢烘,更是在濱河造成了極大的恐慌,老刑警劉巖辆苔,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皂贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昆汹,“玉大人明刷,你說我怎么就攤上這事〕镏螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵居夹,是天一觀的道長败潦。 經(jīng)常有香客問我,道長准脂,這世上最難降的妖魔是什么劫扒? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮狸膏,結(jié)果婚禮上沟饥,老公的妹妹穿的比我還像新娘。我一直安慰自己湾戳,他們只是感情好贤旷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砾脑,像睡著了一般幼驶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上韧衣,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天盅藻,我揣著相機(jī)與錄音,去河邊找鬼畅铭。 笑死氏淑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的硕噩。 我是一名探鬼主播假残,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼炉擅!你這毒婦竟也來了守问?” 一聲冷哼從身側(cè)響起匀归,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耗帕,沒想到半個(gè)月后穆端,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仿便,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年体啰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗽仪。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荒勇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闻坚,到底是詐尸還是另有隱情沽翔,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布窿凤,位于F島的核電站仅偎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雳殊。R本人自食惡果不足惜橘沥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夯秃。 院中可真熱鬧座咆,春花似錦、人聲如沸仓洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽色建。三九已至斤蔓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镀岛,已是汗流浹背弦牡。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漂羊,地道東北人驾锰。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像走越,于是被迫代替她去往敵國和親椭豫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容