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


文章地址 :

12306搶票腳本開發(一)提綱
12306搶票腳本開發(二)解析火車站代號并分析查詢的HTTP請求
12306搶票腳本開發(三)實現一個簡單的查詢腳本
12306搶票腳本開發(四)完善上節課的代碼并面向對象
12306搶票腳本開發(五)更友好的使用方式
12306搶票腳本開發(六)更友好的時間輸入方式
12306搶票腳本開發(七)將前幾節課的成果結合起來實現一個完整的工具


簡介 :

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

1. 相對日期表示法 : 
    1.1 自然語言 : 今天/明天/后天/下個月的15日/下個月的第一個星期五...
    1.2 時間戳 : 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日

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

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

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


代碼 :

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

import datetime
import re

def timeConvertor(content):
    # 首先判斷用戶是不是按規定格式輸入的
    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: # 所有其他沒有的規則都默認查詢今天
        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天后")

總結 :

由于時間的關系 , 本節課最終實現的代碼很簡陋 , 而且之前分析的一些功能并沒有實現 , 但是考慮到用戶的輸入格式錯誤的可能性較小 , 為了提高開發效率 , 盡快能推出一款產品 , 因此這里只是簡單地對用戶輸入的時間進行了格式化 , 完整的格式化代碼會在整個系統開發完成后再進行改進


運行效果 :

Paste_Image.png

參考資料 :

[ Python 日期和時間 ]


預告 :

下節課我們會結合之前所有課程的經驗 , 將之前課程的所有代碼整合起來 , 實現一個可以正常使用的查票引擎
用戶可以使用命令行參數來輸入 :

1. 出發時間 (根據這節課的腳本實現)
2. 出發地
3. 目的地

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容