python的时间模块似乎有点杂乱无章。 例如,以下是docstring中的方法列表:
1
2
3
4
5
6
7
8
9
10
11time() -- return current time in seconds since the Epoch as a float
clock() -- return CPU time since process start as a float
sleep() -- delay for a number of seconds given as a float
gmtime() -- convert seconds since Epoch to UTC tuple
localtime() -- convert seconds since Epoch to local time tuple
asctime() -- convert time tuple to string
ctime() -- convert time in seconds to string
mktime() -- convert local time tuple to seconds since Epoch
strftime() -- convert time tuple to string according to format specification
strptime() -- parse string to time tuple according to format specification
tzset() -- change the local timezone
查看localtime()及其逆mktime(),为什么gmtime()没有反转?
奖金问题:你怎么称呼这个方法? 你会如何实现它?
实际上有一个反函数,但由于一些奇怪的原因,它在日历模块中:calendar.timegm()。我列出了这个答案中的功能。
calendar.timegm(datetime.datetime.utcnow()。utctimetuple())是获取UTC时间戳的一个班轮。
Python:包括电池,但有时电池本身没有组装。
@erikcw:或者只是time.time()在使用Unix纪元的系统上(在我知道的每个系统上)。 +/- float / int转换。
我一直认为时间和日期时间模块有点不连贯。无论如何,这是mktime的反转
1
2
3
4import time
def mkgmtime(t):
"""Convert UTC tuple to seconds since Epoch"""
return time.mktime(t)-time.timezone
弄清楚是否使用time.timezone或time.altzone是困难的部分。 :-)
对于非Python用户:time.timezone是非DST时间增量。 time.altzone是DST时间增量。据我所知,没有真正的方法来判断时间戳是否落在DST上,而不是调用localtime()。
我是第二个Jester,我一般你不能用时区减去因为DST不在时区,这只会让你当地时间(不考虑DST)
1. time.mktime()期望本地时间与calendar.timegm()不同,期望UTC时间元组。这可能会导致范围错误。 2.某些本地时间不明确或不存在,即,有两个相应的时间戳或没有 - mktime()可能会在DST转换周围返回错误的结果。 3.由于DST(altzone)或由于t时间的UTC偏移与当前UTC偏移不同,-time.timezone可能与相应的utc偏移不同。
mktime文档在这里有点误导,没有任何意义说它计算为本地时间,而是根据提供的元组计算Epoch的秒数 - 无论您的计算机位置如何。
如果您确实想要从utc_tuple转换为本地时间,您可以执行以下操作:
1
2
3
4
5
6
7
8
9>>> time.ctime(time.time())
'Fri Sep 13 12:40:08 2013'
>>> utc_tuple = time.gmtime()
>>> time.ctime(time.mktime(utc_tuple))
'Fri Sep 13 10:40:11 2013'
>>> time.ctime(time.mktime(utc_tuple) - time.timezone)
'Fri Sep 13 12:40:11 2013'
也许更准确的问题是如何将utc_tuple转换为local_tuple。
我会称之为gm_tuple_to_local_tuple(我更喜欢长而具有描述性的名字):
1
2>>> time.localtime(time.mktime(utc_tuple) - time.timezone)
time.struct_time(tm_year=2013, tm_mon=9, tm_mday=13, tm_hour=12, tm_min=40, tm_sec=11, tm_wday=4, tm_yday=256, tm_isdst=1)
Validatation:
1
2>>> time.ctime(time.mktime(time.localtime(time.mktime(utc_tuple) - time.timezone)))
'Fri Sep 13 12:40:11 2013'
希望这可以帮助,
髂骨。
这个答案是对的。示范:assert time.gmtime(10**9) == (2001,9,9, 1,46,40, 6,252,0); assert time.mktime((2001,9,9, 1,46,40, 6,252,0)) == 10**9 - 4*3600(最后只在某些系统上才有效,当然,具体取决于当地时区)。原因:mktime确实考虑了当地时区。
我只是Python的新手,但这是我的方法。
1
2
3
4
5
6def mkgmtime(fields):
now = int(time.time())
gmt = list(time.gmtime(now))
gmt[8] = time.localtime(now).tm_isdst
disp = now - time.mktime(tuple(gmt))
return disp + time.mktime(fields)
在那里,我提出了这个功能的名称。 :-)每次重新计算disp非常重要,以防日光节省值发生变化等。 (Jython需要转换回元组.CPython似乎不需要它。)
这是超级ick,因为time.gmtime总是将DST标志设置为false。不过,我讨厌这些代码。必须有一个更好的方法来做到这一点。而且可能还有一些我尚未得到的角落案例。