日期天数差计算(Python)

Python常见题目 同时被 2 个专栏收录
46 篇文章 3 订阅
128 篇文章 5 订阅

目录

描述

输入/输出描述

解决思路

代码

代码走读

传送门

测试用例

1. json文件中日期格式正常:

2. json文件中只有年和月,没有日(day)

3. 日期错误。


描述

        从json文件中读取两个时间数据(数据格式例如:2019.01.01,数据类型是字符串),并计算结果,打印出两个时间间隔了多少天。

输入/输出描述

输入描述

json文件名称datetime.json,格式如下:

{
  "day1": "1949.10.01",
  "day2": "2019.04.25"
}

输出描述

控制台打印两个时间(day1和day2)间隔了多少天。

25408

解决思路

读取json文件中的数据后解析有用的部分,并做校验(检查格式是否正确)。在日期格式正确的情况下将日期转换为datetime.date,并做计算。最后输出结果。

代码

"""
时间差计算。
从json文件中读取两个时间数据,计算并打印两个时间间隔了多少天。
"""

import datetime
import json
import traceback

class TimeFormatError(Exception):
    def __init__(self, message):
        self.message = "TimeFormatError: " + message


def days_compute(times):
    """
    Calculated date interval.
    :param times: <dict> time dictionary
    :return: <int> date interval
    """
    time1 = times["day1"]
    time2 = times["day2"]

    if time1.count(".") < 2:
        raise TimeFormatError("Time format(yyyy.mm.dd) error. %s" % time1)
    if time2.count(".") < 2:
        raise TimeFormatError("Time format(yyyy.mm.dd) error. %s" % time2)

    date1 = parse(time1)
    date2 = parse(time2)

    return (date2 - date1).days


def parse(time_str):
    """
    Parse time format.
    :param time_str: <str> time string
    :return: <datetime.date> date
    """
    time_list = time_str.split(".")
    year = time_list[0]
    month = time_list[1]
    day = time_list[2]

    return datetime.date(int(year), int(month), int(day))


def read_json_file(path):
    """
    Read json file.
    :param path: <str> json file url
    :return: <dict> json file data
    """
    with open(path, "r") as json_file:
        data = json.load(json_file)
    json_file.close()

    return data


# main method
url = "datetimes.json"

try:
    base = read_json_file(url)
    day = days_compute(base)
    print(day)
except TimeFormatError as e:
    print(str(e))
    print("errmsg:\n%s" % traceback.format_exc())
except Exception as e:
    print(str(e))
    print("errmsg:\n%s" % traceback.format_exc())

代码走读

import datetime
import json
import traceback

# 自定义异常类型TimeFormatError, 用于在代码中校验错误时间格式时抛出
class TimeFormatError(Exception):
    def __init__(self, message):
        self.message = "TimeFormatError: " + message


# 定义计算日期差的函数
def days_compute(times):
    """
    Calculated date interval.
    :param times:  time dictionary
    :return:  date interval
    """
    
    # 从字典中获取两个时间日期
    time1 = times["day1"]
    time2 = times["day2"]

    # 日期格式校验,如果日期格式错误(例如“2019.10”),抛出TimeFormatError
    if time1.count(".") < 2:
        raise TimeFormatError("Time format(yyyy.mm.dd) error. %s" % time1)
    if time2.count(".") < 2:
        raise TimeFormatError("Time format(yyyy.mm.dd) error. %s" % time2)

    # 在这里调用自定义的parse函数,将两个日期时间格式由字符串转换为datetime.date格式
    date1 = parse(time1)
    date2 = parse(time2)

    # 返回计算结果(整型)
    return (date2 - date1).days


# 解析时间字符串,转换为datetime.date格式
def parse(time_str):
    """
    Parse time format.
    :param time_str:  time string
    :return:  date
    """
    # 使用split()函数将字符串转化为列表,并分解出年月日
    time_list = time_str.split(".")
    year = time_list[0]
    month = time_list[1]
    day = time_list[2]

    # 将日期转换为datetime.date格式并返回
    return datetime.date(int(year), int(month), int(day))


# 读取json文件的信息,将json文件转化为字典格式
def read_json_file(path):
    """
    Read json file.
    :param path:  json file url
    :return:  json file data
    """
    with open(path, "r") as json_file:
        data = json.load(json_file)
    json_file.close()

    return data


# main method//代码开始执行的地方//json文件的url
url = "datetimes.json"

try:
    # 调用自定义的read_json_file函数获取json文件的内容
    base = read_json_file(url)

    # 计算结果,并打印输出
    day = days_compute(base)
    print(day)

# 捕获异常,打印错误信息和堆栈
except TimeFormatError as e:
    print(str(e))
    print("errmsg:\n%s" % traceback.format_exc())
except Exception as e:
    print(str(e))
    print("errmsg:\n%s" % traceback.format_exc())

传送门

1. count()函数

https://blog.csdn.net/TCatTime/article/details/87388941

2. split()方法

https://blog.csdn.net/TCatTime/article/details/82053259

3. int()函数

https://blog.csdn.net/TCatTime/article/details/82826824

4. print()函数

https://blog.csdn.net/TCatTime/article/details/83450692

5. str()函数

https://blog.csdn.net/TCatTime/article/details/82963437

测试用例

1. json文件中日期格式正常:

json格式如下:

{
  "day1": "1949.10.01",
  "day2": "2019.04.25"
}

python脚本执行结果:

25408

即1949年10月1日与2019年4月25日间隔了25408天。

2. json文件中只有年和月,没有日(day)

json文件如下:

{
  "day1": "1949.10",
  "day2": "2019.04.25"
}

python脚本执行如下:可以看出程序抛出并捕获了自定义异常TimeFormatError,并将其错误堆栈打出。

Time format(yyyy.mm.dd) error. 1949.10
errmsg:
Traceback (most recent call last):
  File "/Users/Desktop/Python Apps/untitled_test/day_compute.py", line 67, in <module>
    day = days_compute(base)
  File "/Users/Desktop/Python Apps/untitled_test/day_compute.py", line 25, in days_compute
    raise TimeFormatError("Time format(yyyy.mm.dd) error. %s" % time1)
TimeFormatError: Time format(yyyy.mm.dd) error. 1949.10

3. 日期错误。

日期错误。例如输入的是1000年13月1日(当然不存在这个日期)。

json文件如下:

{
  "day1": "1000.13.1",
  "day2": "2019.04.25"
}

python执行结果如下:

month must be in 1..12
errmsg:
Traceback (most recent call last):
  File "/Users/Desktop/Python Apps/untitled_test/day_compute.py", line 67, in <module>
    day = days_compute(base)
  File "/Users/Desktop/Python Apps/untitled_test/day_compute.py", line 29, in days_compute
    date1 = parse(time1)
  File "/Users/Desktop/Python Apps/untitled_test/day_compute.py", line 46, in parse
    return datetime.date(int(year), int(month), int(day))
ValueError: month must be in 1..12

代码捕获到python内置异常ValueError(46行的parse函数内所抛出),指出日期有误。

  • 0
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值