如何在 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 时间?的主要内容,如果未能解决你的问题,请参考以下文章