{{ selected_gold.title }}

  • ¥ {{ selected_gold.original_price }}
  • ¥ {{ selected_gold.price }}
  • {{ selected_gold.number_of_order }} 人订阅
  • {{ selected_gold.total_likers_count }}
    由 {{ selected_gold.creator_name }} 编辑

    {{ title }}

    请登录购买({{ selected_gold.price }}元),即可解锁剩余教程
    点击购买

    • Air
    • 2019年1月14日

    Python的日期时间(datetime)

    在Python程序里,为了表示日期和时间,我们需要借助datetime模块。在这篇教程中,我们将把焦点放在该模块上,主要通过以下2个方面来学习Python中的日期和时间:

    • 使用datetime模块
    • 考虑时区

    使用datetime模块

    首先,让我们花一点时间来了解:datetime模块中都提供了哪些功能?

    打开该模块所对应的datetime.py文件(如果你不知道这个文件在那里,那么你可以参考这篇文章来找到该文件),你会看到以下4个类型的定义:

    1. date,它表示日期,因此,它定义了年(year)、月(month)、日(day)
    2. time,它表示时间,因此,它定义了时(hour)、分(minute)、秒(second)、微秒(microsecond)、时区(tzinfo)
    3. datetime,它表示日期+时间,从逻辑概念上来说,它是datetime的合体,但是具体的实现确没有直接使用这2者的功能
    4. tzinfo,它表示时区,用于存储时区相关的信息

    接下来,让我们看看如何使用它们,新建一个文件start.py,输入以下内容:

    from datetime import date, time, datetime
    
    print(date(year=2021, month=12, day=27))
    
    print(time(hour=9, minute=19, second=59))
    
    print(datetime(year=2021, month=12, day=27, hour=9, minute=19, second=59))
    

    以上代码创建了3个对象,它们的类型分别是datetimedatetime,保持上述文件并执行指令python3 start.py你将看到以下输出结果:

    % python3 start.py 
    2021-12-27
    09:19:59
    2021-12-27 09:19:59
    

    除此之外,你还可以通过字符串所表示的日期和时间来创建这些对象。比如,在文件start.py中编写以下内容:

    from datetime import date
    
    print(date.fromisoformat('2021-12-27'))
    

    以上代码使用了方法fromisoformat来创建一个date对象,该方法期望的输入是一个符合ISO 8601规范的日期'2021-12-27'。如果你输入的时间和日期不符合该规范,你可以使用下面这种方法:

    from datetime import datetime
    
    date_in_string = '12-27-2021 9:19:59'
    custom_format = '%m-%d-%Y %H:%M:%S'
    print(datetime.strptime(date_in_string, custom_format))
    

    以上代码用到了strptime,该方法允许你输入不符合ISO 8601规范的时间和日期,不过,你需要自己指定所输入的时间日期('12-27-2021 9:19:59')的格式('%m-%d-%Y %H:%M:%S')。运行指令python3 start.py,你会得到以下结果:

    % python3 start.py 
    2021-12-27 09:19:59
    

    关于strptime所支持的格式以及格式中各个组成部分的解释,你可以参考这里

    如果你留心观察以上时间+日期的输出,你会发现时间部分并没有包含时区的信息。当我们创建时间对象时,就已经假设该时间对象的时区默认为电脑所设置的时区。由于我的电脑时区设置的是北京时间(UTC+8),因此以上输出的时间默认都是在这个时区。

    这样的时间存在一个问题:如果美国地区使用以上时间,那么由于这些时间没有提供时区的信息,那么以上时间就会错误的表示成美国时区的时间。为了解决这个问题,我们需要给时间加上时区的信息,因此需要借助第三方库pytz

    考虑时区

    全球有多少个时区呢?答案是37个时区。如果现在是北京时间5月2号8:00AM,那么对应的纽约时间就是5月1号8:00PM。当你使用电脑的时候,你会根据自己的时区来设置相对应的时区,比如我在中国,那么我的时区就设置为UTC+8,如果我在纽约,那么我可以设置UTC-4。读者可以通过这里来了解时区是如何划分的。

    Python中有一种类型叫datetime,它是指日期+时间,既然涉及到了时间,那么就应该把时间与时区绑定在一起来思考,从而使得你所编写的程序能够在不同时区正确执行。

    为了保留时区,我们需要通过以下2个方面来实现:

    1. 创建带有时区信息的datetime对象
    2. 当存储时间的时候,使用ISO 8601标准来格式化时间,原因在于ISO 8601标准保留了时区信息。

    为了实现以上2部分,你首先需要安装pytz包,接着,在start.py中输入以下代码:

    from datetime import datetime
    import pytz
    
    print(datetime.now(tz=pytz.utc))
    
    print(datetime.now(tz=pytz.utc).isoformat())
    

    执行以上代码,你会得到以下输出结果:

    % python3 start.py
    2021-12-26 02:39:46.628761+00:00
    2021-12-26T02:39:46.628829+00:00
    

    从以上输出结果可知,时间部分包含了时区信息00:00(UTC),最后一行是以ISO 8601标准来输出今天的日期+时间。以上输出的时间的时区是UTC+0,那么,如果你想创建一个包含时区UTC+8的datetime对象,你可以参考以下代码:

    from datetime import datetime
    import pytz
    
    print(datetime.now(tz=pytz.timezone('Asia/Shanghai')))
    

    执行以上代码,你将得到北京时区的时间,如下所示:

    % python3 start.py
    2021-12-26 11:00:57.410203+08:00
    

    以上2个例子均创建了带有时区的datetime对象,当你想创建time对象时,也可以遵守以上规则来为该时间对象添加时区。关于pytz的使用,你可以参考这里。如果你想了解时区的概念,那么可以参考以下内容:

    总结

    本文介绍了datetime模块,其中涉及了datetimedatetimetzinfo类型。通常,你只需要使用它们就能非常方便地在Python中表达时间+日期。如果你编写的程序需要跨越不同的时期,那么从一开始你就需要为这些时间加上时区。为了添加时区,你需要借助第三方包pytz,因此你首先需要安装它。

    到目前为止,我们介绍了Python的基础知识,涉及的内容主要有:

    我们可以借助以上知识来编写简单的Python程序,然而想要编写复杂的程序,则要借助其它高级的知识。接下来,让我们进入高阶知识的学习:Python的函数