介绍
在这个项目中,你将学习如何使用 Python 构建一个时间旅行目的地计算器。这个计算器将帮助你根据当前日期和宇宙飞船估计的飞行天数,确定时间旅行宇宙飞船能够到达的最远过去和未来日期。
👀 预览
## 输入:
## 输出:
🎯 任务
在这个项目中,你将学习:
- 如何从给定字符串中提取日期信息
- 如何根据给定的天数计算过去和未来的日期
- 如何格式化计算出的日期并将其作为字符串列表返回
🏆 成果
完成这个项目后,你将能够:
- 理解如何在 Python 中处理日期和时间增量
- 实现一个计算时间旅行目的地的函数
- 在代码中处理异常和边界情况
- 编写简洁且可维护的 Python 代码
提取日期信息
在这一步中,你将学习如何从输入的时间字符串中提取年、月、日。
- 在你喜欢的代码编辑器中打开
time_travel_destination.py文件。 - 找到
time_travel_destination(time: str, days: int)函数。 - 在函数内部,添加以下代码以从
time参数中提取年、月、日:
try:
## 从时间字符串中提取年、月、日
year, month, day = map(int, time.split("-"))
## except (ValueError, OverflowError):
## ## 如果发生 ValueError 或 OverflowError,返回空列表
## return []
这一行使用 map() 函数和 split() 方法将 time 字符串转换为表示年、月、日的整数列表。
- 接下来,你需要检查提取的日期是否有效。你可以使用
datetime.date()函数来做到这一点:
## 从时间字符串中提取年、月、日
year, month, day = map(int, time.split("-"))
## 检查日期是否有效
datetime.date(year, month, day)
如果日期有效,这一行不会引发任何异常。如果日期无效,将引发 ValueError。
计算过去和未来的日期
在这一步中,你将学习如何根据给定的天数来计算过去和未来的日期。
- 在
time_travel_destination(time: str, days: int)函数内部,添加以下代码来计算过去和未来的日期:
try:
past_time = datetime.date(year, month, day) - datetime.timedelta(days=days)
except OverflowError:
past_time = datetime.date(1, 1, 1)
future_time = datetime.date(year, month, day) + datetime.timedelta(days=days)
past_time 变量是通过从原始日期中减去 days 参数来计算的。但是,如果得到的日期早于可表示的最小日期(公元 1 年 1 月 1 日),将会引发 OverflowError。在这种情况下,我们将 past_time 设置为可表示的最小日期。
future_time 变量是通过将 days 参数加到原始日期来计算的。
格式化并返回结果
在这一步中,你将学习如何格式化过去和未来的日期,并将它们作为字符串列表返回。
- 在
time_travel_destination(time: str, days: int)函数内部,添加以下代码来格式化过去和未来的日期,并将它们作为列表返回:
return [past_time.strftime("%d-%m-%Y"), future_time.strftime("%d-%m-%Y")]
strftime() 方法用于将 past_time 和 future_time 的 datetime.date 对象格式化为 "dd-mm-yyyy" 格式的字符串。
- 最后,添加一个异常处理块,以捕获函数执行过程中可能发生的任何
ValueError或OverflowError异常:
except (ValueError, OverflowError):
return []
如果引发了这些异常中的任何一个,函数将返回一个空列表。
你最终的 time_travel_destination(time: str, days: int) 函数应该如下所示:
import datetime
def time_travel_destination(time: str, days: int):
try:
## 从时间字符串中提取年、月、日
year, month, day = map(int, time.split("-"))
## 检查日期是否有效
datetime.date(year, month, day)
try:
## 从给定日期中减去指定的天数
past_time = datetime.date(year, month, day) - datetime.timedelta(days=days)
except OverflowError:
## 如果发生溢出错误,将 past_time 设置为可表示的最小日期
past_time = datetime.date(1, 1, 1)
## 将指定的天数加到给定日期上
future_time = datetime.date(year, month, day) + datetime.timedelta(days=days)
## 以 'dd-mm-yyyy' 格式返回过去和未来的日期
return [past_time.strftime("%d-%m-%Y"), future_time.strftime("%d-%m-%Y")]
except (ValueError, OverflowError):
## 如果发生 ValueError 或 OverflowError,返回空列表
return []
你现在已经完成了 time_travel_destination(time: str, days: int) 函数的实现。你可以通过运行 time_travel_destination.py 文件主块中的提供的示例来测试该函数。下面提供了一些示例:
- 输入:
print(time_travel_destination('2238-2-11', 30))
print(time_travel_destination('2238-2-11', 0))
print(time_travel_destination('2238-2-11', 100))
- 输出:
['12-01-2238', '13-03-2238']
['11-02-2238', '11-02-2238']
['03-11-2237', '22-05-2238']
总结
恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。



