如何在Python中获得UTC时间?

Jam*_*rke 94 python datetime

我在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;
}
Run Code Online (Sandbox Code Playgroud)

什么是等效的Python代码?

Art*_*nka 149

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

from datetime import datetime
datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)

出于您的目的,当您需要计算两个日期之间所花费的时间时,您所需要的只是减去结束日期和开始日期.这种减法的结果是timedelta对象.

从python文档:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
Run Code Online (Sandbox Code Playgroud)

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

返回持续时间中包含的总秒数.相当于(td.microseconds +(td.seconds + td.days*24*3600)*10*6)/ 10*6,使用真正的除法计算.

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

Tim*_*son 99

仅简单的标准库。与datetime.utcnow().

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)
Run Code Online (Sandbox Code Playgroud)

  • 根据 Python 3 文档,这是推荐的方法。 (17认同)
  • 如果您更喜欢本地时间(例如,为了更容易向用户显示)但仍然是时区安全的,您可以使用“datetime.now().astimezone()” (4认同)
  • 干净又简单!应该是首选方式。 (3认同)
  • @Marry35 是的,这应该是现在的首选方式。当第一次问这个问题时,“timezone.utc”不存在。 (2认同)

Mar*_*som 37

在与您原件最接近的表格中:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now
Run Code Online (Sandbox Code Playgroud)

如果您需要知道1970-01-01而不是本机Python的秒数datetime,请改用:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()
Run Code Online (Sandbox Code Playgroud)

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

utc_now = datetime.datetime.utcnow
Run Code Online (Sandbox Code Playgroud)

  • 也许您应该考虑将UtcNow()包装在另一个函数中.这太简单了.也不要使用下划线.PEP 8太无聊了...... (7认同)
  • `(now - datetime.datetime(1970, 1, 1)).total_seconds()` ...那么 `time.time()` 怎么样? (2认同)

Mik*_*keL 17

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) 
Run Code Online (Sandbox Code Playgroud)


Ces*_*ssa 12

时区感知零外部依赖:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)
Run Code Online (Sandbox Code Playgroud)


hec*_*nto 7

从datetime.datetime开始,您已经可以使用方法strftime导出到时间戳.按照你的函数示例:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

import datetime

utc_time = datetime.datetime.utcnow() 
print(utc_time.strftime('%Y%m%d %H%M%S'))
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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