Python 将ISO 8601时间格式转换为UNIX时间戳(历元),然后再转换回来,而不损失小数秒?
Python如何将ISO 8601时间格式转换为UNIX时间戳(epoch)并在不损失小数秒的情况下再次转换 我找到了几个例子,但所有的例子似乎都在转换过程中的某个时刻降低了分数秒。下面的例子 问题似乎是到UNIX时间戳(epoch)的初始转换。代码如下Python 将ISO 8601时间格式转换为UNIX时间戳(历元),然后再转换回来,而不损失小数秒?,python,timestamp,Python,Timestamp,Python如何将ISO 8601时间格式转换为UNIX时间戳(epoch)并在不损失小数秒的情况下再次转换 我找到了几个例子,但所有的例子似乎都在转换过程中的某个时刻降低了分数秒。下面的例子 问题似乎是到UNIX时间戳(epoch)的初始转换。代码如下 def ISO8601ToEpoch(theString): from datetime import datetime import calendar return calendar.timegm(datetime
def ISO8601ToEpoch(theString):
from datetime import datetime
import calendar
return calendar.timegm(datetime.strptime(theString, "%Y-%m-%dT%H:%M:%S.%f").timetuple())
def EpochToISO8601(theEpoch):
from datetime import datetime
return datetime.fromtimestamp(theEpoch).isoformat()
#
print 'Original Time {0}'.format('2018-04-27T04:19:51.050937')
theTime=ISO8601ToEpoch('2018-04-27T04:19:51.050937')
print 'Time {0}'.format(theTime)
print 'Original Time {0}'.format(EpochToISO8601(theTime)
结果是
原时间2018-04-27T04:19:51.050937
时间1524802791
原时间2018-04-27T04:19:51
有没有一种方法可以让时间元组不破坏小数秒数?这里的问题是,您正在将理解微秒的
日期时间转换为不理解微秒的时间元组
显而易见的解决办法就是不要那样做
如果您想将datetime
对象转换为时间戳,只需使用该方法,就像您已经使用fromtimestamp
classmethod进行转换一样
一,。您可能能够诱使时间元组
保持浮点值
,而不是int
数秒。但是你会破坏类型的不变量。而且,更重要的是,破坏了该类型的全部用途,即与20世纪80年代风格的Cstruct tm
完全相同。也可能会破坏timegm
函数,该函数可能只调用同名的C函数。(大多数time
模块是围绕C的
的薄薄包装,而不是datetime
,后者是为Python设计的友好模块。)然后timegm
被记录为返回一个整数类型,因此即使你做到了这一点,它也将一无所获。我认为这是正确的。。。但如果没有,我相信有人会指出我错过了什么
>>> import datetime as datetime
>>> import dateutil.parser
>>> import time
# Create a sample UNIX timestamp...
>>> t=time.time()
>>> t
1478266530.573583
# Convert the time stamp sample to ISO format...
>>> i=datetime.datetime.utcfromtimestamp(t).isoformat()
>>> i
'2016-11-04T13:35:30.573583'
# Convert ISO format to UNIX time stamp...
>>> d=dateutil.parser.parse(i)
>>> d
datetime.datetime(2016, 11, 4, 13, 35, 30, 573583)
>>> s=(time.mktime(d.timetuple())*1e3+d.microsecond/1e3)/1e3
>>> s
1478266530.5735831
考虑到生成的时间戳的小数位数,这并不是一个完美的转换,但足够接近我的需要。我确信ISO格式是一个争论的焦点,但该格式与我期望遇到的典型格式相匹配,这当然是缺少“Z”限定符。为什么要使用timetuple
(和calendar.timegm
)Unix时间戳是以整数秒为单位定义的,而不是首先使用datetime
对象,您无法转换为它而不丢失小数秒。除非您使用实数创建自己的等效定义。@Markransem否,“Unix时间戳”实际上并没有定义为整数time\t
是,但POSIX定义了至少两种其他时间戳类型,它们具有亚秒字段,在Linux和macOS中用作更精确的时间戳。这就是为什么Python的datetime.timestamp()
和datetime.fromtimestamp
尽可能处理浮动。(当然,time
和calendar
中的较低级别函数没有,因为它们专门包装time\u t
和struct tm
)OP的代码已经在一个方向上利用了这一事实,并且他工作了;我从谷歌的资源中得到了这些程序,试图避免一些努力,但这显然不是很好。有人能提供一个将ISO转换为时间戳并再次转换的代码示例吗?不是python大师,还在学习。请举例说明。@Schorschi您已经写了一个方向。对于相反的方向,只需获取strptime
的结果并在其上调用timetuple
。此外,如果您查看模块的文档,而不是搜索随机代码,然后尝试找出它的作用,您将更快地找到答案。有些模块没有完整或清晰的文档记录,但大多数stdlib都是。(在您尝试编写tkinter GUI之前…)因此,在修补时间元组和time.mktime之后,我想我得到了我需要的:>>>将datetime导入为datetime>>导入dateutil.parser>>导入time>>>t=time.time()>>t 1478266530.573583>>I=datetime.datetime.utcfromtimestamp(t).isoformat()>>>i'2016-11-04T13:35:30.573583'>>d=dateutil.parser.parse(i)>>d datetime.datetime(2016,11,4,13,35,30573583)>>s=(time.mktime(d.timetuple())*1e3+d.microsecond/1e3)/1e3>>s 1478266530。5735831@Schorschi为什么您要做所有这些工作,而不是只调用时间戳
?举例说明?哪个什么地方?Z
表示它在GMT时区。如果没有Z
、偏移量或时区ID,您所拥有的是一个模糊的“原始”日期时间(意味着它没有指定时区),但如果仅在本地使用,则可以用作本地时间。实际上,考虑到环境和编码标准,一切都是UTC。当然,这会“掩盖”问题。不管怎样,我已经做了一个注释,当我有一点时间的时候,我会回过头来解决Z问题,所以它是显式限定的。