gpt4 book ai didi

python - Python:将UTC时间元组转换为UTC时间戳

转载 作者:IT老高 更新时间:2023-10-28 21:14:10 26 4
gpt4 key购买 nike

我的问题:我需要将一个UTC时间元组转换为一个UTC时间戳。但我有些困惑。
首先一点信息:
time.mktime(tuple):此函数始终以本地时间返回时间戳。
这是localtime()的反函数。它的参数是结构时间或完整的9元组,用本地时间而不是UTC表示时间。
calendar.timegm(tuple):这将从提供的时间元组返回UTC时间戳
采用时间模块中的gmtime()函数返回的时间元组,并返回相应的unix时间戳值。实际上,time.gmtime()和timegm()是彼此的倒数。
现在让我们做一个测试:

>>> from datetime import datetime
>>> import time
>>> import calendar as cal

>>> utc_now = datetime.utcnow()
>>> now = datetime.now()
>>> utc_now
datetime.datetime(2013, 3, 16, 9, 17, 22, 489225)
>>> now
datetime.datetime(2013, 3, 16, 5, 17, 29, 736903)

>>> time.mktime(datetime.timetuple(utc_now)), time.mktime(datetime.timetuple(now))
(1363439842.0, 1363425449.0)
>>> cal.timegm(datetime.timetuple(utc_now)), cal.timegm(datetime.timetuple(now))
(1363425442, 1363411049)

为什么有四种不同的价值观?当我想将一个UTC时间元组转换成一个UTC时间戳时,哪一个是正确的?
向上分布
我想我已经找到了我困惑的答案,所以让我解释一下。
首先,我们需要知道一些重要的事情:
有两种日期和时间对象:“幼稚”和“意识”。
感知对象对适用的算法和政治时间调整(如时区和夏令时信息)有足够的知识,以相对于其他感知对象定位自身。一个有意识的对象被用来表示一个特定的时间点,而这个时间点不能被解释[1]。
原始对象不包含足够的信息,无法明确地相对于其他日期/时间对象定位自身。一个幼稚的对象是否代表协调世界时(UTC)、当地时间或其他时区的时间完全取决于程序,就像一个特定的数字是否代表米、英里或质量取决于程序一样。幼稚的对象容易理解和使用,代价是忽略现实的某些方面。
我们从 datetime.utcnow()datetime.now()得到的是“幼稚”的对象。这意味着返回的 datetime对象无论如何都不会提到您的本地时间或UTC时间——它只是表示“某个时间”。它只封装日期和时间信息(年、月、日、小时、分钟、秒等)。您有责任将其与本地或UTC的概念联系起来。
所以,请记住,一个幼稚的datetime对象只是表示“一段时间”。 datetime.now()函数返回一个“some time”(某个时间)等于当前时间, datetime.utcnow()函数返回“some time”(某个时间),即格林威治英格兰的当前时间(即UTC)。
“某个时间”只是日期和时间的值。请注意,在地球上不同的位置,“某个时间”发生在不同的时间。例如,如果某个“某个时间”值是1月1日10:30,那么它将是格林威治英格兰的当前时间,比它成为纽约的当前时间早5个小时。
因此,我们可以看到有两件事:一个通用的“某个时间”值,以及“某个时间”在不同的“时间”在不同的位置成为当前时间的概念。(这里没有双关语,继续读下去)
现在,让我们先定义什么是“时代”。我们知道“某个时间”只是时间的一般值。然后,时代是发生在英格兰格林威治的“某个时间”,参数值为: January 1 1970, 00:00:00
“时间戳”是指自该时代以来经过的秒数。这意味着时间戳在英格兰格林威治时是 0但纽约时间 Jan 1, 1970, 00:00:00时,时间戳约为(5*60*60)。
>>> tt = datetime.timetuple(datetime(1970, 1, 1, 0, 0, 0))
>>> cal.timegm(tt)
0

因此,我们可以看到当我们更改位置时, Jan 1, 1970, 00:00:00的相同“某个时间”值具有不同的时间戳。因此,当你谈论时间戳时,你还需要说“什么位置”与时间戳相关,以及该位置向东或向西与格林威治英格兰相关的程度。该位置表示为“时区”。
现在,每个系统(计算机)都配置了时区,与该时区相关的所有时间戳都有效地成为“本地”。UTC是全局引用。
因此,假设您有一个“some time”的 Jan 1, 1970, 00:00:00值,它转换为:
本地时间的时间戳
X时间戳(UTC)
这意味着“一段时间”内, Y秒数必须经过一段时间才能成为您所在位置的当前时间, Z秒数必须经过一段时间才能使英格兰格林威治的当前时间成为“一段时间”。
现在,最后,让我们回到我们的函数 YZ。这需要一个时间元组,这只是“一段时间”的另一种表示。请记住,我们给他们传递的是一段天真的时光,没有任何关于当地或UTC的概念。
假设 mktime是一个时间元组,表示一个幼稚的“some time”。然后
timegm将返回必须经过的秒数,以便您的本地当前时间成为“某个时间”,并且
X将返回使英格兰格林威治的当前时间等于“某个时间”所需的秒数。
在上面的示例中, mktime(X)timegm(X)表示幼稚的“某个时间”,当我们将这些“某个时间”值输入到 nowutc_now中时,它们只返回相应位置(您的位置和格林威治英格兰)必须经过的秒数,以使其当前时间为“某个时间”。
最后,回到我的问题:我需要将一个UTC时间元组转换为一个UTC时间戳。
首先,没有“UTC时间元组”的概念——它只是“一段时间”。如果我需要将其转换为UTC,我只需使用以下命令:
cal.timegm(datetime.timetuple(utc_now))

它将给出当前UTC时间的时间戳(即,英格兰格林威治当前的“某个时间”)。

最佳答案

实际上只有三种不同的价值观。这两个值:

1363425449.0 (time.mktime(datetime.timetuple(now))
1363425442 (cal.timegm(datetime.timetuple(utc_now)))

只相差7秒,这是您在转储变量时最初看到的:
>>> utc_now
datetime.datetime(2013, 3, 16, 9, 17, 22, 489225)
>>> now
datetime.datetime(2013, 3, 16, 5, 17, 29, 736903)

(注意输出的秒数部分中的22对29。)
其他两个值只是错误的,因为您应用了错误的参数类型-您使用UTC值而不是本地值调用了 time.mktime,使用本地值而不是UTC值调用了 cal.timegm。文档清楚地说明了期望值-因此请确保只使用适当的值。你基本上可以看到你的本地时间偏移(4小时,从它的外观上看)是在不应该应用的时候应用的(根据错误所在的不同方向)。
当您诊断这样的事情时,使用 epochconverter.com会给您当前的unix时间戳,这样您就可以将其与输出进行比较。

关于python - Python:将UTC时间元组转换为UTC时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15447632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com