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天后")

总结 :

由于时间的关系 , 本节课最终实现的代码很简陋 , 而且之前分析的一些功能并没有实现 , 但是考虑到用户的输入格式错误的可能性较小 , 为了提高开发效率 , 尽快能推出一款产品 , 因此这里只是简单地对用户输入的时间进行了格式化 , 完整的格式化代码会在整个系统开发完成后再进行改进

运行效果 :

《12306抢票脚本开发(六)更友好的时间输入方式》 Paste_Image.png

参考资料 :

[ Python 日期和时间 ]

预告 :

下节课我们会结合之前所有课程的经验 , 将之前课程的所有代码整合起来 , 实现一个可以正常使用的查票引擎
用户可以使用命令行参数来输入 :

1. 出发时间 (根据这节课的脚本实现)
2. 出发地
3. 目的地

然后程序就会自动去请求 12306 的数据接口 , 得到数据后再格式化显示出来

    原文作者:王一航
    原文地址: https://www.jianshu.com/p/69463cac0e9b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞