关于日期时间:如何在python中获取UTC时间?

How to get UTC time in Python?

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

1
2
3
4
5
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代码?


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

1
2
from datetime import datetime
datetime.utcnow()

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

从python文档中:

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

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

Return the total number of seconds contained in the duration.
Equivalent to (td.microseconds + (td.seconds + td.days * 24 * 3600) *
10*6) / 10*6 computed with true division enabled.


以最接近原文的形式:

1
2
3
4
5
import datetime

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

如果您需要知道1970-01-01的秒数,而不是本机python datetime,请使用以下方法:

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

Python的命名约定与JavaScript中可能使用的命名约定不一致,请参见PEP8。另外,一个只返回另一个函数结果的函数是相当愚蠢的;如果只是为了使它更容易访问,您可以通过简单地分配函数来为它创建另一个名称。上面的第一个示例可以替换为:

1
utc_now = datetime.datetime.utcnow


1
2
3
4
5
6
7
8
9
10
11
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)


从datetime.datetime,您已经可以使用strftime方法导出到时间戳。遵循函数示例:

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

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


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

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

并正常调用函数;

1
print(utc_now())

具有零外部依赖项的时区感知:

1
2
3
4
from datetime import datetime, timezone

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