将ISO 8601时间格式转换为UNIX时间戳(纪元)并再次返回而不会丢失小数秒的Python方法?
我找到了几个示例,但所有示例似乎都在转换的某个时刻丢失了小数秒。以下示例......
问题似乎是初始转换为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
有没有办法让时间段不能破解小数秒?
答案 0 :(得分:0)
这里的问题是你将warning: incompatible pointer types passing 'char (*)[12]' to
parameter of type 'char **' [-Wincompatible-pointer-types]
- 它理解微秒 - 转换为select mails,substring_index(substring_index(mails,'@',-1),'.',1)
from mails
- 但不是。 1
明显的解决办法就是不这样做。
如果您想将datetime
对象转换为时间戳,只需使用timestamp
方法,就像您已经使用timetuple
类方法走另一条路一样。
<子> 1。您可能能够欺骗datetime
持有fromtimestamp
而不是timetuple
秒。但是你要打破这种类型的不变量。而且,更重要的是,打败了类型的整个目的,这与20世纪80年代风格的C float
相同。并且可能还会破坏int
函数,它可能只调用同名的C函数。 (大多数struct tm
模块是围绕C timegm
的薄包装,而不是time
,这是为Python设计的友好模块。)然后记录<time.h>
返回一个整数类型,所以即使你走得那么远,也一无所获。
答案 1 :(得分:0)
我认为这是正确的......但如果不是,我相信有人会指出我错过了什么。
>>> 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”限定符。