如何获取UTC当前时间(现在)?

问题描述 投票:0回答:10

我有一个 python 日期时间对象(代表从现在开始的五分钟),我想将其转换为 UTC。我计划以 RFC 2822 格式输出它以放入 HTTP 标头,但我不确定这对于这个问题是否重要。我在这个网站上找到了一些关于转换时间对象的信息,这样看起来更简单,但是这次我真的想使用日期时间对象,因为我正在使用 timedeltas 来调整它们:

我尝试过这样的事情:

from datetime import datetime, timedelta

now = datetime.now()
fiveMinutesLater = datetime.now() + timedelta(minutes=5)
fiveMinutesLaterUtc = ???

时间或日期时间模块中没有任何内容看起来对我有帮助。看来我可以通过 3 或 4 个函数传递 datetime 对象来做到这一点,但我想知道是否有更简单的方法。

我不想使用第三方模块,但如果这是唯一合理的选择,我可能会这样做。

python datetime time utc
10个回答
82
投票

运行此命令以获得 UTC 格式的原始日期时间(并为其添加五分钟):

>>> from datetime import datetime, timedelta
>>> datetime.utcnow()
datetime.datetime(2021, 1, 26, 15, 41, 52, 441598)
>>> datetime.utcnow() + timedelta(minutes=5)
datetime.datetime(2021, 1, 26, 15, 46, 52, 441598)

如果您更喜欢时区感知的日期时间对象,请在 Python 3.2 或更高版本中运行:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc)
datetime.datetime(2021, 1, 26, 15, 43, 54, 379421, tzinfo=datetime.timezone.utc)

11
投票

首先,您需要通过设置其

tzinfo
成员来确保日期时间是时区感知对象:

http://docs.python.org/library/datetime.html#datetime.tzinfo

然后您可以使用

.astimezone()
函数进行转换:

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone


6
投票

对于那些最终来到这里寻找将日期时间对象转换为自 UNIX 纪元以来的 UTC 秒数的方法的人:

import time
import datetime

t = datetime.datetime.now()
utc_seconds = time.mktime(t.timetuple())

4
投票

使用以下内容:

from datetime import timezone
utc_datetime = local_datetime.astimezone().astimezone(timezone.utc).replace(tzinfo=None)

假设一个原始日期时间对象具有本地日期时间,您可以使用以下方法调用序列将其转换为表示相同 UTC 时间的原始 UTC 日期时间(使用 Python 3.6.3 测试)。

  1. astimezone() 添加本地时区,这样它就不再天真了。
  2. astimezone(timezone.utc) 将其从本地转换为 UTC。
  3. replace(tzinfo=None) 删除时区,所以它又很天真,但现在是 UTC

示例:

>>> local_datetime = datetime.now()
>>> local_datetime
datetime.datetime(2019, 12, 14, 10, 30, 37, 91818)
>>> local_datetime.astimezone()
datetime.datetime(2019, 12, 14, 10, 30, 37, 91818, tzinfo=datetime.timezone(datetime.timedelta(-1, 68400), 'Eastern Standard Time'))
>>> local_datetime.astimezone().astimezone(timezone.utc)
datetime.datetime(2019, 12, 14, 15, 30, 37, 91818, tzinfo=datetime.timezone.utc)
>>> local_datetime.astimezone().astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2019, 12, 14, 15, 30, 37, 91818)

注意:第一个 astimezone() 并不是真正需要的,因为 Python 文档中有这样的注释:

3.6 版更改:现在可以调用 astimezone() 方法 假定代表系统本地时间的天真实例。


2
投票

我找到了一种方法来获取当前时间,向其中添加一个 timedelta 对象,将结果转换为 UTC,然后在 RFC 2822 中输出:

time.strftime("%a, %d-%b-%Y %H:%M:%S GMT",
    time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds))

这并没有完全回答我的问题,但我把它放在这里是因为它可能会帮助处于我情况的其他人。

编辑:我想补充一点,这个技巧仅在时间增量小于一天时才有效。如果您想要适用于任何类型的 timedelta 值的东西,您可以使用

timedelta.total_seconds()
(对于 Python 2.7 及更高版本),或使用
86400*timedelta.days + timedelta.seconds
。我还没有实际尝试过,所以我不能 100% 确定它是否有效。


2
投票

这是一个适用于 Python 2 和 3 的 stdlib 解决方案(无第 3 方模块)。

要获取 RFC 2822 格式的当前 UTC 时间:

>>> from email.utils import formatdate
>>> formatdate(usegmt=True)
'Fri, 27 Mar 2015 08:29:20 GMT'

要获取未来 5 分钟后的 UTC 时间:

#!/usr/bin/env python
import time
from email.utils import formatdate

print(formatdate(time.time() + 300, usegmt=True)) # 5 minutes into the future
# -> Fri, 27 Mar 2015 08:34:20 GMT

1
投票

您可以在 email.Utils 模块中使用 formatdate 方法,如下所示

>>> from email.Utils import formatdate
>>> print formatdate()
Sun, 25 Jul 2010 04:02:52 -0000

以上是 RFC 2822 格式的日期时间。默认情况下它返回 UTC 时间,但如果您需要当地时间,您可以调用 formatdate(localtime=True)。

有关更多信息,请检查 http://docs.python.org/library/email.mime.html#module-email.util


1
投票

要将日期字符串转换为 UTC:

from time import mktime
from datetime import datetime

mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M")))

0
投票

解决方案神奇Delorean lib

>>> import datetime
>>> import delorean
>>> dt = datetime.datetime.now()
>>> dl = delorean.Delorean(dt, timezone='US/Pacific')
>>> dl.shift('UTC')
Delorean(datetime=2015-03-27 03:12:42.674591+00:00, timezone=UTC)

>>> dl.shift('UTC').datetime
datetime.datetime(2015, 3, 27, 3, 12, 42, 674591, tzinfo=<UTC>)

>>> dl.shift('EST').datetime
datetime.datetime(2015, 3, 26, 22, 12, 42, 674591, tzinfo=<StaticTzInfo 'EST'>)

它允许轻松地在不同时区之间转移日期时间


0
投票

它很旧,但令人惊讶的是没有人建议这个解决方案

>>> from datetime import datetime, UTC
>>> now = datetime.now(UTC)
© www.soinside.com 2019 - 2024. All rights reserved.