时间旅行目的地计算器

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何使用 Python 构建一个时间旅行目的地计算器。这个计算器将帮助你根据当前日期和宇宙飞船估计的飞行天数,确定时间旅行宇宙飞船能够到达的最远过去和未来日期。

👀 预览

## 输入:

## 输出:

🎯 任务

在这个项目中,你将学习:

  • 如何从给定字符串中提取日期信息
  • 如何根据给定的天数计算过去和未来的日期
  • 如何格式化计算出的日期并将其作为字符串列表返回

🏆 成果

完成这个项目后,你将能够:

  • 理解如何在 Python 中处理日期和时间增量
  • 实现一个计算时间旅行目的地的函数
  • 在代码中处理异常和边界情况
  • 编写简洁且可维护的 Python 代码

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/PythonStandardLibraryGroup -.-> python/date_time("Date and Time") subgraph Lab Skills python/type_conversion -.-> lab-302782{{"时间旅行目的地计算器"}} python/function_definition -.-> lab-302782{{"时间旅行目的地计算器"}} python/catching_exceptions -.-> lab-302782{{"时间旅行目的地计算器"}} python/date_time -.-> lab-302782{{"时间旅行目的地计算器"}} end

提取日期信息

在这一步中,你将学习如何从输入的时间字符串中提取年、月、日。

  1. 在你喜欢的代码编辑器中打开 time_travel_destination.py 文件。
  2. 找到 time_travel_destination(time: str, days: int) 函数。
  3. 在函数内部,添加以下代码以从 time 参数中提取年、月、日:
try:
    ## 从时间字符串中提取年、月、日
    year, month, day = map(int, time.split("-"))
## except (ValueError, OverflowError):
##     ## 如果发生 ValueError 或 OverflowError,返回空列表
##     return []

这一行使用 map() 函数和 split() 方法将 time 字符串转换为表示年、月、日的整数列表。

  1. 接下来,你需要检查提取的日期是否有效。你可以使用 datetime.date() 函数来做到这一点:
## 从时间字符串中提取年、月、日
year, month, day = map(int, time.split("-"))
## 检查日期是否有效
datetime.date(year, month, day)

如果日期有效,这一行不会引发任何异常。如果日期无效,将引发 ValueError

计算过去和未来的日期

在这一步中,你将学习如何根据给定的天数来计算过去和未来的日期。

  1. 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 参数加到原始日期来计算的。

格式化并返回结果

在这一步中,你将学习如何格式化过去和未来的日期,并将它们作为字符串列表返回。

  1. time_travel_destination(time: str, days: int) 函数内部,添加以下代码来格式化过去和未来的日期,并将它们作为列表返回:
return [past_time.strftime("%d-%m-%Y"), future_time.strftime("%d-%m-%Y")]

strftime() 方法用于将 past_timefuture_timedatetime.date 对象格式化为 "dd-mm-yyyy" 格式的字符串。

  1. 最后,添加一个异常处理块,以捕获函数执行过程中可能发生的任何 ValueErrorOverflowError 异常:
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 中练习更多实验来提升你的技能。