Rya*_*yan 21 python datetime timestamp unix-timestamp
假设一个给定的变量,它包含一个UNIX时间戳,但无论是以秒还是毫秒格式都是未知的,我想分配一个以秒为单位格式的变量
unknown = 1398494489444 # This is millisecond
t = ???
Run Code Online (Sandbox Code Playgroud)
更新:我明白在不给出一些限制的情况下无法判断,所以就是这样
Assume current_ts = current unix timestamp
San*_*man 43
如果您将最大时间戳值转换为以毫秒为单位的x位数,则会得到如下内容:
你的时间戳可以比2001年更早吗?如果不是,我认为您可以安全地检查该数字是否有13位数或更多 - 如果是,您有毫秒,如果不是,您有秒.当然,这只会在以秒为单位的时间戳也有13位数之前有效,这意味着以毫秒为单位的时间戳将有16位数:
如果您的时间戳不能超过1973年,那么你可以将条件放宽到12位或更多.这个条件应该没有问题,直到:
Flo*_*ris 24
有可能吸引downvotes,我想记录在案,说不要做.
对物理量的单位做出假设是一个可怕的想法 - 它导致了火星气象轨道器的破坏(计算的推力单位是磅,发动机预计牛顿.没有足够的推力 - 并且轨道器燃烧在大气层).
如果你对一个数字的大小非常了解,你应该能够对单位进行"有根据的猜测".例如,如果我告诉你我的体重是230,你可以看着我,然后想"我打赌这是磅,而不是公斤".同样地,如果你将我生日的时间戳转换为假设的日期,以秒为单位,并且结果是将来200年,你可以合理地假设"秒"是错误的单位.
但这是一件危险的事情.
仍然 - 如果你必须这样做,那么一般来说,我会推荐以下方法:
最后一件事很重要 - 它可以让你从错误中吸取教训.例如,如果您的时间戳告诉您下次出现彗星的时间,您可以打印
彗星的下一个预期出现:2546年12月29日(假设:X的时间戳在几秒钟内给出)
通过这种方式,有一些"回来".一般来说," 记录你的假设 "不仅仅是一个好的建议 - 它在任何精确的科学中都是必不可少的.
最后 - 将时间戳从ms转换为s是通过将数字除以1000来实现的.但我相信你知道这一点.
Mar*_*ers 22
使用您的约束,检测毫秒时间戳是微不足道的.即使是过去一年的时间戳仍然比当前时间戳大.
只需测试数字是否大于当前时间戳; 如果是这样,你有一个以毫秒为单位的时间戳:
now = time.mktime(time.gmtime())
if t > now:
# milliseconds, convert to seconds
t /= 1000.0
Run Code Online (Sandbox Code Playgroud)
除以1000,将时间戳转换回以秒为单位表示的值,time并可应用默认模块函数.
这是因为,即使是在毫秒的时间戳较一年过去,不小心解释为以秒为时间标记,将位于远的未来:
>>> import time
>>> ts = time.mktime(time.gmtime())
>>> year_ago = ts - (86400 * 365)
>>> time.gmtime(year_ago * 1000) # misinterpret milliseconds as seconds
time.struct_time(tm_year=45395, tm_mon=7, tm_mday=9, tm_hour=14, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=190, tm_isdst=0)
Run Code Online (Sandbox Code Playgroud)
你必须在1970年初有一个时间戳才能混淆这两个范围:
>>> now = time.mktime(time.gmtime())
>>> time.gmtime(ts / 1000) # misinterpret seconds as milliseconds
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=17, tm_hour=5, tm_min=25, tm_sec=13, tm_wday=5, tm_yday=17, tm_isdst=0)
Run Code Online (Sandbox Code Playgroud)
例如,UNIX纪元之后的前17天中的时间戳可能会混淆时间戳(以毫秒为单位).该日期之后的所有内容都将大于"当前时间"时间戳.
根据您的具体限制,您很幸运我们可以轻松地将两个单元分开.该更好的选择是不要陷入这种局面摆在首位.这些数据来自某个地方; 尽可能早地确定您拥有的数据类型,而不必在以后猜测.没有系统会在某些时间以秒为单位随机给您时间戳,其余时间以毫秒为单位的时间戳.当然,您可以根据其他信息了解您采购的数据类型,并在当时进行转换或注释您的数据以包含类型?