以Unix时间戳格式获取当前GMT时间的最简单方法是什么?


175

Python提供不同的套餐(datetimetimecalendar),可以看出这里为了应对时间。我通过使用以下命令获取当前GMT时间犯了一个大错误time.mktime(datetime.datetime.utcnow().timetuple())

在Unix时间戳中获取当前GMT时间的简单方法是什么?


1
什么是输入/输出?datetime.utcnow()返回当前UTC时间作为datetime对象(假设您在谈论“ GMT时间”时需要UTC)。time.time()直接返回Unix时间戳作为浮点数。这是将datetime.date/datetime.datetime(表示UTC时间)转换为POSIX timestamp的方法
jfs


为什么您的方法是错误的?
skeller88 '17

Answers:


230

我将使用time.time()获得自该纪元以来的时间戳(以秒为单位)。

import time

time.time()

输出:

1369550494.884832

对于大多数平台上的标准CPython实现,这将返回UTC值。


21
问题是您的计算机的本地时钟可能不在UTC中。
9000

@ 9000:是的,尽管我总是在任何时间紧迫的环境中坚持使用UTC。他确实要求最简单的解决方案。请注意,在现代平台(包括Linux,BSD,Mac OS X和Windows)上使用CPython时,都将为time.time()返回UTC。这反映了这些操作系统上C标准库的时间功能的行为。
Edmond Burnett

66
@ 9000:本地时区无关紧要。Unix时间对应于UTC时间(如果我们忽略leap秒左右的时间)。想一想:时间戳是从纪元(固定的时间点)起经过的秒数:为什么要取决于哪个时区机器的本地时钟使用?在世界任何时候,Unix时间都是相同的。某些(未知)平台可能使用不同的纪元,但其值仍不取决于本地时区。
jfs


125
import time

int(time.time()) 

输出:

1521462189

42

这有帮助吗?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

如何将Python UTC日期时间对象转换为UNIX时间戳


@Cairnarvon那只是一个例子。如果您需要当前时间戳,则只需调用即可,根本time.time()不需要日期时间转换。
Messa

1
FWIW:这不是UTC时间,而是UTC转换为本地时间。要获得UTC的时间戳,您必须做其他事情。
Sherlock70年

18

或者只是简单地使用datetime标准模块

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

您可以截断或乘以所需的分辨率。此示例输出毫。

如果您想要正确的Unix时间戳(以秒为单位),请删除* 1000


您的代码非常具体是将时间强制为整数,因此我很困惑为什么输出文本为十进制数字?
韦斯顿

是的,我不好,我后来添加了int转换
Maresh

这与Javascript moment库的完全等效moment().utc().valueOf()。正是我想要的。谢谢
azhar22k '18 -10-19

UNIX时间戳自1970年以来应该是几秒钟。您的解决方案不会产生这种情况。
凌晨

1
“您可以根据需要的分辨率截断或相乘”除去* 1000部分,您将获得秒数。
Maresh

18

python2python3

最好使用时间模块

import time
int(time.time())

1573708436

您还可以使用datetime模块,但是当您使用strftime('%s')时,strftime会将时间转换为本地时间!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()

2
作为在UTC + 1,time.time()并且datetime.utcnow().timestamp()没有给出相同的价值!
user136036 '19

同样,尽管我期望第二个选项是正确的,但我不得不使用datetime.now()。timestamp()来获取UTC + 1100中的正确值。我希望timestamp()都能正确运行,但似乎无法正常工作
David Waterworth

仔细观察,datetime.utcnow()和datetime.now()都返回原始日期时间(无tzinfo),并且当tzinfo = null时,timestamp()看起来是本地的。
大卫·沃特沃思

2

我喜欢这种方法:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

此处发布的其他方法不能保证在所有平台上都具有UTC,或者只能报告整秒。如果您想获得完整的分辨率,则可以达到微秒级。


1
不幸的是,除非您碰巧处于UTC + 0000时区,否则这似乎无法提供UTC。使用utctimetuple代替虽然可以解决问题。
凌晨

1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

输出:

1544524990

这与time.time()我的回报不一样。
Alwinius

1
那可能是因为dt.utcnow返回了datetime没有时区的信息。然后strftime假设datetime是当地时间。
凌晨

1
@skyking几乎是此页面上所有答案的问题!
David Waterworth

1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

输出:1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

输出:1572878043

  • 在这里,我们可以看到第一个示例比第二个示例提供了更准确的时间。
  • 在这里,我正在使用第一个。

1

至少在python3中,这有效:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
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.