将ISO 8601时间格式转换为UNIX时间戳(纪元)并再次返回而不会丢失小数秒?

时间:2018-04-27 04:39:49

标签: python timestamp

将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

有没有办法让时间段不能破解小数秒?

2 个答案:

答案 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”限定符。