描述
从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: time dictionary
:return: 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: time string
:return: 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: 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
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()函数
2. split()方法
3. int()函数
4. print()函数
5. str()函数
测试用例
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
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
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函数内所抛出),指出日期有误。
标签:return,Python,天数,json,日期,file,time,day,TimeFormatError
来源: https://blog.csdn.net/TCatTime/article/details/89838237