如何在Python中获取UTC时间?


113

我已经在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还是JavaScript?
6

Answers:


179

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

from datetime import datetime
datetime.utcnow()

为了您的目的,当您需要计算两个日期之间花费的时间时,您所需要做的就是减去结束日期和开始日期。这种相减的结果是一个时间增量对象。

从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,且启用了真除法。


2
关于datetime.utcnow()的可能令人讨厌的惊喜是,尽管有该名称,它也不返回时区感知对象。我认为这是一个大问题,这就是为什么我更喜欢下面的答案。请参阅“没有时区的datetime对象应被视为应用程序中的“错误”。 julien.danjou.info/python-and-timezones
蒂姆·理查森

1
所谓的朴素日期时间对象(即未设置时区信息)的概念确实有一个目的:无论我身在世界何处,我都希望闹钟每天在06:00:00响。另外,它还允许在计算机游戏中使用“虚拟时钟”:现在是我的幻想世界中的下午5点。将时区强加到datetime对象上会很尴尬,尤其是使用timedelta算法时。
DustByte

42

以最接近原件的形式:

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

1
我喜欢您的答案,而不是从上面获得较高评价的答案。谢谢你的深入。
Jordan Dea-Mattson

@Jordan,回头看我的答案,我意识到我将导入放在函数中而不是在全局级别上犯了一个风格错误,我现在要解决这个问题。
Mark Ransom 2013年

8
也许您应该考虑将UtcNow()包装在另一个函数中。太简单了。也请不要使用下划线。PEP 8太无聊了……
vcarel 2014年

1
绝对不需要编写函数来返回简单的单行代码... datetime.datetime.utcnow()
cpreid

1
@TimRichardson我不同意,但是在编写此答案时,别无选择-Python不包括任何tzinfo对象,即使对于UTC也是如此。
马克·兰瑟姆

31

仅简单,标准的库,适用于现代python。与相比,提供可识别时区的日期时间datetime.utcnow()datetimes没有时区的事故正在等待发生。

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

5
根据Python 3文档,这是推荐的方法。
roskakori

干净又简单!应该是首选方式。
结婚

21
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) 

10

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

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

如果需要微秒,则需要更改导出字符串并将其强制转换为float,如下所示: return float(now.strftime("%s.%f"))


直接获得数字时,转换为字符串然后再转换为数字有什么意义?
Mark Ransom

关键是您可能想更改函数上的内容,因此最好使用datetime对象,而不要使用time.time(),也可以使用time.mktime(now.timetuple())直接转换为int。无论如何,对于这种简单的情况time.time()也是有效的选择。我觉得奇怪的是,通过timedelta去寻找秒。
hectorcanto

请注意,这strftime("%s")取决于平台,在Windows上不起作用。(至少它不适用于Windows 10)。
朱利安·基尔希


-4

在使用lambda表达式的Python 3中,尝试一下;

from datetime import datetime
utc_now = lambda : datetime.utcnow()

并正常调用该函数;

print(utc_now())

2
现在变得好孩子们; ^)
Demis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.