Python 将ISO 8601时间格式转换为UNIX时间戳(历元),然后再转换回来,而不损失小数秒?

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

Python如何将ISO 8601时间格式转换为UNIX时间戳(epoch)并在不损失小数秒的情况下再次转换

我找到了几个例子,但所有的例子似乎都在转换过程中的某个时刻降低了分数秒。下面的例子

问题似乎是到UNIX时间戳(epoch)的初始转换。代码如下

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年代风格的C
struct 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问题,所以它是显式限定的。