转换为UTC时间戳

18
# parses some string into that format.
datetime1 = datetime.strptime(somestring, "%Y-%m-%dT%H:%M:%S")

# gets the seconds from the above date.
timestamp1 = time.mktime(datetime1.timetuple())

# adds milliseconds to the above seconds.
timeInMillis = int(timestamp1) * 1000

我如何在代码的任何时间点将日期转换为UTC格式?我已经浏览了API好像有一个世纪,但找不到能够运作的东西。有人可以帮忙吗?它目前似乎正在将其转换为东部时间(但我在GMT,想要UTC)。

编辑:我将答案给了最接近我最终发现的方法的那个人。

datetime1 = datetime.strptime(somestring, someformat)
timeInSeconds = calendar.timegm(datetime1.utctimetuple())
timeInMillis = timeInSeconds * 1000

:)


请说明somestring所在的时区是什么?是UTC还是本地时区?如果datetime1不是已经在UTC中,则timegm(datetime1.utctimetuple())将无法工作。 utctimetuple()不会将其转换为UTC,除非给定已知的datetime对象。 - jfs
4个回答

20

datetime.utcfromtimestamp很可能是你正在寻找的:

>>> timestamp1 = time.mktime(datetime.now().timetuple())
>>> timestamp1
1256049553.0
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2009, 10, 20, 14, 39, 13)

5
仅适用于Python 3。 - mr-sk
2
为什么这只适用于Python 3?它似乎在2.7中运行良好。 - sevko
1
由于“AttributeError: module 'datetime' has no attribute 'utcfromtimestamp'”,返回值为-1。 - Sebi2020

6

我认为你可以使用utcoffset()方法:

utc_time = datetime1 - datetime1.utcoffset()

文档提供了一个使用astimezone()方法的示例,可以在这里找到。
另外,如果你要处理时区,你可能会想要查看PyTZ库,它有很多有用的工具,可以将datetime转换为各种时区(包括EST和UTC之间)。
使用PyTZ:
from datetime import datetime
import pytz

utc = pytz.utc
eastern = pytz.timezone('US/Eastern')

# Using datetime1 from the question
datetime1 = datetime.strptime(somestring, "%Y-%m-%dT%H:%M:%S")

# First, tell Python what timezone that string was in (you said Eastern)
eastern_time = eastern.localize(datetime1)

# Then convert it from Eastern to UTC
utc_time = eastern_time.astimezone(utc)

+1 对于 pytz 的 localize()。注意:问题中的 datetime1 是一个无时区信息的 datetime 对象,即 datetime1.utcoffset() 返回 None(不能通过这种方式获取 UTC 时间)。 - jfs

6

您可能想要其中的一个:

import time
import datetime

from email.Utils import formatdate

rightnow = time.time()

utc = datetime.datetime.utcfromtimestamp(rightnow)
print utc

print formatdate(rightnow) 

这两个输出看起来是这样的:
2009-10-20 14:46:52.725000
Tue, 20 Oct 2009 14:46:52 -0000

5
def getDateAndTime(seconds=None):
 """
  Converts seconds since the Epoch to a time tuple expressing UTC.
  When 'seconds' is not passed in, convert the current time instead.
  :Parameters:
      - `seconds`: time in seconds from the epoch.
  :Return:
      Time in UTC format.
"""
return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))`

这将本地时间转换为UTC时间

time.mktime(time.localtime(calendar.timegm(utc_time)))

如果使用mktime将struct_time转换为秒数,那么此转换将以本地时区进行。没有任何办法告诉它使用特定的时区,甚至仅使用UTC。标准的“时间”包始终假定时间处于您的本地时区。请参考该链接了解更多信息。

-1: getDateAndTime() 和问题所问的如何获取“seconds”无关,而且它是有问题的:实现与文档字符串不符。如果你有 utc_time,那么只需调用 calendar.timegm() 就足够了(本地时间、mktime 都是不必要的,可能会产生错误的结果)。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接