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


文章地址 :

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


簡介 :

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

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

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

1. 每一種格式中都包含年月日這三個(gè)元素
2. 這三個(gè)元素之后的字符是分隔符 , 這個(gè)分隔符有兩種情況 : 
  2.1 都相同 , 例如 2017/01/01
  2.2 固定的格式 : 年 月 日 / 年 月 號
3. 有的時(shí)候 , 用戶可能會省略 年份 或者 年份和月份 , 但是 日期 并不會少 , 這種情況就表示出發(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)的代碼很簡陋 , 而且之前分析的一些功能并沒有實(shí)現(xiàn) , 但是考慮到用戶的輸入格式錯(cuò)誤的可能性較小 , 為了提高開發(fā)效率 , 盡快能推出一款產(chǎn)品 , 因此這里只是簡單地對用戶輸入的時(shí)間進(jìn)行了格式化 , 完整的格式化代碼會在整個(gè)系統(tǒng)開發(fā)完成后再進(jìn)行改進(jìn)


運(yùn)行效果 :

Paste_Image.png

參考資料 :

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


預(yù)告 :

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容