描述
從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