Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 何时使用datetime.utcnow()或datetime.now(tz=pytz.utc).replace(tzinfo=None)_Python_Datetime_Timezone_Pytz - Fatal编程技术网

Python 何时使用datetime.utcnow()或datetime.now(tz=pytz.utc).replace(tzinfo=None)

Python 何时使用datetime.utcnow()或datetime.now(tz=pytz.utc).replace(tzinfo=None),python,datetime,timezone,pytz,Python,Datetime,Timezone,Pytz,我想了解我应该何时使用 datetime.now(tz=pytz.utc).replace(tzinfo=None) 而不是简单地 datetime.utcnow() 后者是否会不考虑夏时制等因素?很多如何使用日期时间。日期时间的工作方式取决于运行它的机器。主机的本地时间和时区设置将决定您将获得的输出 如果主机位于UTC时区,则datetime.datetime.now()和datetime.datetime.utcnow()之间将没有差异 根据报告: 处理时间的首选方法是始终以UTC工作,

我想了解我应该何时使用

datetime.now(tz=pytz.utc).replace(tzinfo=None)
而不是简单地

datetime.utcnow()

后者是否会不考虑夏时制等因素?

很多如何使用日期时间。日期时间的工作方式取决于运行它的机器。主机的本地时间和时区设置将决定您将获得的输出

如果主机位于UTC时区,则
datetime.datetime.now()和
datetime.datetime.utcnow()之间将没有差异

根据报告:

处理时间的首选方法是始终以UTC工作,仅当生成供人读取的输出时才转换为localtime


pytz
用于计算夏令时,
datetime.datetime.utcnow()
用于提供一个通用的标准化参考点,您可以根据该点计算夏令时
datetime.datetime.utcnow()
本身不会考虑夏令时。

你永远不应该使用
datetime.utcnow()
,因为它会给你一个天真的时间戳,你可以用它射自己的脚。如果你真的想要一个幼稚的时间戳,使用你的第一个选项使它显式
now()
接受tz参数(您应该始终提供该参数,以避免使用主机tz)。但是
utcnow()
显然没有提供这一点。所以这是注定的

例如,假设您有UTC时间戳,并且希望将其转换为墨西哥城的本地时间:

my_timestamp.astimezone(pytz.timezone("America/Mexico_City"))
看起来不错,对吧?不,看看这个:

>>> datetime.utcnow()
datetime.datetime(2021, 3, 29, 21, 40, 44, 329559)
>>> datetime.utcnow().astimezone(pytz.timezone("America/Mexico_City"))
datetime.datetime(2021, 3, 29, 21, 40, 44, 329559, tzinfo=<DstTzInfo 'America/Mexico_City' CST-1 day, 18:00:00 STD>)
>datetime.utcnow()
datetime.datetime(2021,3,29,21,40,44,329559)
>>>datetime.utcnow().astimezone(pytz.timezone(“美国/墨西哥城”))
datetime.datetime(2021,3,29,21,40,44,329559,tzinfo=)
正如您所看到的,
astimezone
如果您给它一个天真的时间戳,它只会在tz上加上标签,而不会像预期的那样调整实际时间。(如果您不想调整,您应该使用
.replace

这非常令人困惑,如果你只是确保没有天真的时间戳,你就不会遇到这样的问题。如果您愿意,您可以将它们放在外部API中,但在它们进入系统时附加一个时区

总而言之:总是使用
datetime.now(tz=some_tz)