如何在 Python 中获取 UTC 时间?

Posted

技术标签:

【中文标题】如何在 Python 中获取 UTC 时间?【英文标题】:How to get UTC time in Python? 【发布时间】:2013-04-03 03:30:36 【问题描述】:

我在 StackExchange 上搜索了一堆解决方案,但没有什么能完全满足我的需要。在 javascript 中,我使用以下方法计算自 1970 年 1 月 1 日以来的 UTC 时间:

function UtcNow() 
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;

等效的 Python 代码是什么?

【问题讨论】:

相关:Python: How to get a value of datetime.today() that is “timezone aware”? 等等,你用的是 Python 还是 JavaScript? 【参考方案1】:

为什么所有回复都是基于日期时间而不是时间? 我认为是简单的方法!

import time
nowgmt = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
print(nowgmt)

【讨论】:

nowgmt 将是一个字符串,它不如拥有一个日期时间对象灵活【参考方案2】:

您可以使用 datetime 库来获取 UTC 时间,甚至是本地时间。

import datetime

utc_time = datetime.datetime.utcnow() 
print(utc_time.strftime('%Y%m%d %H%M%S'))

【讨论】:

【参考方案3】:

仅简单的标准库。与datetime.utcnow() 不同,提供可感知时区的日期时间。

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

【讨论】:

根据 Python 3 文档,这是推荐的方法。 干净简单!应该是首选方式。 @Marry35 是的,这应该是现在的首选方式。首次提出问题时,timezone.utc 不存在。 如果你更喜欢本地时间(例如为了更方便地显示给用户)但仍然是时区安全的,你可以使用datetime.now().astimezone()【参考方案4】:

零外部依赖的时区感知:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

【讨论】:

为了以zulu格式打印,这是要走的路datetime.utcnow().replace(tzinfo=timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')【参考方案5】:
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 

【讨论】:

【参考方案6】:

您已经可以从 datetime.datetime 使用 strftime 方法导出到时间戳。按照您的功能示例:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

如果您想要微秒,则需要更改导出字符串并强制转换为浮点数,例如:return float(now.strftime("%s.%f"))

【讨论】:

能直接得到数字的情况下,转成字符串再转回数字有什么意义? 重点是你可能想要改变函数的内容,因此最好坚持使用 datetime 对象,而不是使用time.time(),你也可以使用 time.mktime(now.timetuple( )) 直接转换为 int。无论如何,对于这个简单的案例time.time() 也是一个有效的选项。我觉得奇怪的是,通过 timedelta 来查找秒数。 请注意,strftime("%s") 依赖于平台,不适用于 Windows。 (至少在 Windows 10 上不适合我)。【参考方案7】:

以最接近您的原件的形式:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

如果您需要知道从 1970-01-01 开始的秒数,而不是原生 Python datetime,请改用:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Python 的命名约定与您在 Javascript 中可能使用的命名约定不一致,请参阅 PEP 8。此外,一个简单地返回另一个函数结果的函数是相当愚蠢的。如果只是为了使其更易于访问,您可以通过简单地分配来为函数创建另一个名称。上面的第一个例子可以替换为:

utc_now = datetime.datetime.utcnow

【讨论】:

我更喜欢您的回答,而不是上面评分较高的回答。感谢您在这里的深度。 也许您应该考虑将 UtcNow() 包装在另一个函数中。这太简单了。也不要使用下划线。 PEP 8 太无聊了…… 绝对不需要写一个函数来返回一个简单的单行... datetime.datetime.utcnow() @cpreid 我的习惯是写出接近问题中给出的代码格式的答案。我觉得这有助于理解。 UtcNow = datetime.datetime.utcnow(函数是 Python 中的一等公民——你不需要在这里创建一个新函数,用不同的名字来调用它)。【参考方案8】:

试试这个使用datetime.utcnow()的代码:

from datetime import datetime
datetime.utcnow()

当您需要计算两个日期之间花费的时间时,您只需减去结束日期和开始日期即可。这种减法的结果是timedelta object.

来自 python 文档:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

这意味着默认情况下,您可以获得其定义中提到的任何字段 - 天、秒、微秒、毫秒、分钟、小时、周。 timedelta 实例也有 total_seconds() 方法:

返回持续时间中包含的总秒数。 等价于 (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10*6) / 10*6 在启用真除法的情况下计算。

【讨论】:

datetime.utcnow() 可能令人讨厌的惊喜是它不返回时区感知对象,尽管有名称。在我看来,这是一个大问题,这就是为什么我更喜欢下面的答案。请参阅“没有时区的日期时间对象应被视为应用程序中的“错误”。” julien.danjou.info/python-and-timezones 所谓天真的日期时间对象(即没有设置时区信息)的概念确实有一个目的:我希望我的闹钟每天在 06:00:00 响起,无论在哪里我的世界。它还允许在说计算机游戏中使用“虚拟时钟”:在我的幻想世界中现在是下午 5 点。在 datetime 对象上强制使用时区会很尴尬,尤其是使用 timedelta 算术。

以上是关于如何在 Python 中获取 UTC 时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 和 django 中使用 Pytz 根据给定的 UTC 偏移量转换数据和时间?

如何在 Python 中获取 GMT 并将其转换为 PST

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

如何从日历中获取 UTC 时间戳?

如何使用 pytz 从时区字符串中获取 UTC 偏移量?

如何在 JavaScript 中获取 UTC 时间戳?