Python函数`datetime.now()`和`datetime.today()`有什么区别?

67

Python函数datetime.now()datetime.today()有什么区别?

In [1]: from datetime import datetime

In [2]: datetime.now()

Out[2]: datetime.datetime(2015, 9, 11, 12, 8,28, 909842)

In [3]: datetime.today()

Out[3]: datetime.datetime(2015, 9, 11, 12,8, 45, 175839)
4个回答

55

datetime.datetime.now()需要将tzinfo作为关键字参数传入,但datetime.today()不需要任何关键字参数。

默认情况下,now()执行时的参数为datetime.datetime.now(tz=None)

如文档所述:https://docs.python.org/3.6/library/datetime.html#datetime.datetime.now

datetime.now()返回当前本地日期和时间。如果可选参数tz为None或未指定,则类似于today(),但是如果可以从时间戳(例如,在提供C gettimeofday()函数的平台上可能可以)获得更高的精度。


3
顺便提一下,要指定东部时间(ET)时区,我使用 import datetime.datetime, pytz; datetime.datetime.now(tz=pytz.timezone('US/Eastern'))。更多细节请参见此处 - Vivek Subramanian
1
就我个人而言,now()today() 更快。在我的机器上,now() 平均为 213 纳秒,而 today() 平均为 653 纳秒。这可能微不足道,也可能不是,具体取决于你正在做什么。 - Steven C. Howell

14
请参考datetime.todaydatetime.now的文档,特别是后者链接中的此部分:

如果可选参数 tz 为 None 或未提供,则类似于 today(),但如果可能的话,提供比通过 time.time() 时间戳获取的精度更高(例如,在提供 C gettimeofday() 函数的平台上可能是这样)。

因此在您的示例中,两者都是相同的,尽管特定的平台可能会使用datetime.now提供更高的精度。

4

请参阅文档now()提供可选的时区,并且可以提供更高的精度。


2
实际上,有三个类似的函数:
  • datetime.now(tz=None) 返回当前本地日期和时间。
  • datetime.today() 返回当前本地日期时间,tzinfo 为 None。
  • datetime.utcnow() 返回当前UTC日期和时间,tzinfo 为 None。

首先要注意的是来自文档的

此函数(datetime.now())优于 datetime.today()datetime.utcnow()


我认为有两个原因:
首先,在功能上,`datetime.now` 可以完成 `datetime.today` 和 `datetime.utcnow` 的功能,但反过来不行。
>>> from datetime import datetime
>>> from datetime import timezone
>>>
>>> # datetime.now(tz=None) is equivalent to datetime.today();
>>> # datetime.utcnow() can't do this!
>>> datetime.now(tz=None)  # This is my local time
datetime.datetime(2022, 11, 2, 14, 59, 29, 265094)
>>> datetime.today()
datetime.datetime(2022, 11, 2, 14, 59, 29, 650280)
>>>
>>> # datetime.now(tz=timezone.utc) is equivalent to datetime.utcnow();
>>> # datetime.today() can't do this!
>>> datetime.now(tz=timezone.utc)
datetime.datetime(2022, 11, 2, 6, 59, 58, 298594, tzinfo=datetime.timezone.utc)
>>> datetime.utcnow()  # note that `tzinfo` is lost
datetime.datetime(2022, 11, 2, 6, 59, 58, 763605)

此外,请注意datetime.utcnow()的输出中丢失了tzinfo。 这意味着您没有机会在上下文之外知道确切的时间。 这也在文档中指出:

警告:由于许多datetime方法将单纯的datetime对象视为本地时间, 因此最好使用感知时区的datetime表示UTC时间。 因此,表示当前UTC时间的推荐方法是调用datetime.now(timezone.utc)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接