Python-将任何历元时间转换为格式化日期时间的代码

Python-将任何历元时间转换为格式化日期时间的代码,python,python-3.x,Python,Python 3.x,在Python3.6或3.7中是否有转换任何历元时间的通用方法。我让代码在一个大纪元的时间内工作,但我调用了各种RESTAPI,其中一些比其他的更精确 我把具体时间除以100000000就可以了。但如果可能的话,我想要一个函数来转换历元时间,不管它是多少位数。 如果内置函数无法实现这一点,那么这是测试位数的最佳方法,只需除以适当的数字即可 另一篇帖子建议使用time.strftime,但我无法让它发挥作用 我看到过一些关于eror“OSError:[Errno 22]Invalid argume

在Python3.6或3.7中是否有转换任何历元时间的通用方法。我让代码在一个大纪元的时间内工作,但我调用了各种RESTAPI,其中一些比其他的更精确

我把具体时间除以100000000就可以了。但如果可能的话,我想要一个函数来转换历元时间,不管它是多少位数。 如果内置函数无法实现这一点,那么这是测试位数的最佳方法,只需除以适当的数字即可

另一篇帖子建议使用time.strftime,但我无法让它发挥作用

我看到过一些关于eror“OSError:[Errno 22]Invalid argument”(我得到的)的堆栈流讨论,但没有一个讨论过一个转换来处理所有可能格式的概念

例如:

from datetime import datetime
import datetime as datetime1  #still confused about this 
                              #sometimes I use other functions that require the 
                              #the first import above. 
import time

epoch_time1 = 1598653800
epoch_time2   = 1598653800006864384
# epoch_time2   = 1598653800006864384 / 100000000  #this works 
quoteTimeDTObj1 = datetime1.datetime.fromtimestamp(epoch_time1)
#quoteTimeDTObj1 = time.strftime('%Y-%m-%d %H:%M:%S', epoch_time1)
print("quoteTimeDTObj1=" + str(quoteTimeDTObj1))

quoteTimeDTObj2 = datetime1.datetime.fromtimestamp(epoch_time2)
#quoteTimeDTObj2 = time.strftime('%Y-%m-%d %H:%M:%S', epoch_time2)
print("quoteTimeDTObj2=" + str(quoteTimeDTObj2))

假设您有时接收到以毫秒为单位的历元时间,有时接收到以纳秒为单位的历元时间,则类似的方法是可行的:

from datetime import datetime


def epoch_to_dt(epoch_time):
    if epoch_time> 2147483647:
        return datetime.fromtimestamp(epoch_time / 100000000)
    else:
        return datetime.fromtimestamp(epoch_time)


print(epoch_to_dt(1598653800))
print(epoch_to_dt(1598653800006864384))
结果:

2020-08-29 08:30:00
2020-08-29 08:30:00.006864
datetime
模块不想执行此处所做的操作:假设一个较大的值自动意味着需要纳秒。标准的历元时间是毫秒,可以是整数值,也可以是浮点值,小数部分表示小于毫秒的部分,我建议您在自己的代码中也使用小数部分

至于进口方面的困惑:这有点像是遗留下来的东西。从
datetime
导入
datetime
确实令人困惑。
from datetime import datetime
中的第一个
datetime
是模块,第二个是带有有用类方法的类(这些是您经常需要的函数)

最好总是从datetime导入datetime
,如果需要,还可以导入其他部分,如从datetime导入datetime
、timedelta
。或者有多个导入语句,如果您愿意的话

我选择2147483647的原因似乎是随机的,因为这是32位整数的最大整数值,并且通常不会超出它定义历元时间。详情如下:


当然,2038年问题的不同解决方案可能会导致上面的代码成为问题,这就是为什么我建议在代码中表示纪元时间总是表示“自1970-01-01 00:00:00起的毫秒”(不带分数),以避免将来出现问题。

类似的方法很有效,假设您有时接收到以毫秒为单位的历元时间,有时接收到以纳秒为单位的历元时间:

from datetime import datetime


def epoch_to_dt(epoch_time):
    if epoch_time> 2147483647:
        return datetime.fromtimestamp(epoch_time / 100000000)
    else:
        return datetime.fromtimestamp(epoch_time)


print(epoch_to_dt(1598653800))
print(epoch_to_dt(1598653800006864384))
结果:

2020-08-29 08:30:00
2020-08-29 08:30:00.006864
datetime
模块不想执行此处所做的操作:假设一个较大的值自动意味着需要纳秒。标准的历元时间是毫秒,可以是整数值,也可以是浮点值,小数部分表示小于毫秒的部分,我建议您在自己的代码中也使用小数部分

至于进口方面的困惑:这有点像是遗留下来的东西。从
datetime
导入
datetime
确实令人困惑。
from datetime import datetime
中的第一个
datetime
是模块,第二个是带有有用类方法的类(这些是您经常需要的函数)

最好总是从datetime导入datetime
,如果需要,还可以导入其他部分,如从datetime导入datetime
、timedelta
。或者有多个导入语句,如果您愿意的话

我选择2147483647的原因似乎是随机的,因为这是32位整数的最大整数值,并且通常不会超出它定义历元时间。详情如下:


当然,2038年问题的不同解决方案可能会导致上面的代码成为问题,这就是为什么我建议在代码中表示纪元时间始终表示“自1970-01-01 00:00:00以来的毫秒”(不带分数),为了避免将来的问题。

显然,在某些情况下,你得到的是以纳秒为单位的纪元时间,而在其他情况下,得到的是以毫秒(常见)为单位的纪元时间?您可以只检查值的大小,并假设超过某个值(可能是2147483647)的任何值都是纳秒,但这当然可能会导致后续问题。显然,您在某些情况下获得的历元时间是纳秒,在其他情况下是毫秒(常见)?您可以检查值的大小,并假设超过某个值(可能是2147483647)的任何值都是纳秒,但这当然可能会导致后续问题。这是历元时间的唯一两种格式吗?我曾使用len(str(epochtime))作为临时转机,但我担心可能会有1000个,100000个,100000000个。它们实际上不是两种格式——我认为只有毫秒是正常的。纳秒级(或者像你建议的微秒级)是个例外。如果你不知道的话,很难区分微秒级和纳秒级。也就是说,在70年代的某个地方,它是微秒还是纳秒?这就是为什么如果这些数字不是整毫秒,那么最好将它们表示为浮点数。在您的案例中,问题是:这些值来自哪里?你对可能的格式了解多少?这是大纪元时间仅有的两种格式吗?我曾使用len(str(epochtime))作为临时转机,但我担心可能会有1000个,100000个,100000000个。它们实际上不是两种格式——我认为只有毫秒是正常的。纳秒级(或者像你建议的微秒级)是个例外。如果你不知道的话,很难区分微秒级和纳秒级。也就是说,在70年代的某个地方,它是微秒还是纳秒?这就是为什么如果这些数字不是整毫秒,那么最好将它们表示为浮点数。在您的案例中,问题是:这些值来自哪里?您对可能的格式了解多少?