Python时间戳(13位)到字符串返回2074年,以及如何将15位时间戳转换为字符串

Python时间戳(13位)到字符串返回2074年,以及如何将15位时间戳转换为字符串,python,timestamp,instagram-api,Python,Timestamp,Instagram Api,所以我使用的是Instagram API,我需要知道图片上传的时间。通常一切正常,时间戳如下所示: >>> import time >>> timestamp = 1497423819748 >>> time.strftime("%d %b %Y %H:%M:%S GMT", time.gmtime(timestamp / 1000.0)).split(' ') ['14', 'Jun', '2017', '07:03:39', 'GMT']

所以我使用的是Instagram API,我需要知道图片上传的时间。通常一切正常,时间戳如下所示:

>>> import time
>>> timestamp = 1497423819748
>>> time.strftime("%d %b %Y %H:%M:%S GMT", time.gmtime(timestamp / 1000.0)).split(' ')
['14', 'Jun', '2017', '07:03:39', 'GMT']
或者这个:

>>> timestamp = 1497425126
>>> time.strftime('%d %b %Y %H:%M:%S GMT', time.gmtime(timestamp)).split(' ')
['14', 'Jun', '2017', '07:25:26', 'GMT']
但某些媒体具有如下所示的时间戳:

>>> timestamp = 3302720163189
>>> time.strftime("%d %b %Y %H:%M:%S GMT", time.gmtime(timestamp / 1000.0)).split(' ')
['28', 'Aug', '2074', '22:16:03', 'GMT']
甚至这个15位数的时间戳:

>>> timestamp = 186693871989665
>>> time.strftime("%d %b %Y %H:%M:%S GMT", time.gmtime(timestamp / 100000.0)).split(' ')
['28', 'Feb', '2029', '02:05:19', 'GMT']
请你帮我把这些类型的时间戳也正确地转换成字符串,或者这些时间戳有问题

更新:

如果是15位数字,则打印:

186693871989665 1497381289


所以有时候InstagramAPI提供给我的“设备时间戳”似乎有点问题,我不确定,但它似乎返回了用户设备拍摄照片时的时间,并且用户手机上的时间不正确),但“拍摄时间”似乎返回了正确的时间戳,所以我现在就使用它,但需要thx帮助。如果您对此有不同的答案,我希望看到它。

在使用API时,我看到了一些不同的格式

  • Unix时间戳,10位,例如1200499926
  • Unix时间戳,带微秒,15位,例如143062470196222
  • Unix时间戳,带微秒,16位,例如1278276905502403
  • Javascript格式(不知道名称),13位,例如1508609431327
由于我在浏览器中查看这些内容,因此需要通过
Date()
解析它们,因此您的案例可能会有所不同

无论采用哪种方式,唯一需要的转换是将其中的每一个转换为13位字符串,我得到了正确的输出:

// Multiply by 1000 to include milliseconds
// > "Wed Jan 16 2008 08:12:06 GMT-0800 (Pacific Standard Time)"
new Date(1200499926 * 1000).toString();

// Divide by 100 to scrap the extraneous microseconds
// > "Sat May 02 2015 20:45:01 GMT-0700 (Pacific Daylight Time)"
new Date(143062470196222 / 100).toString();

// Divide by 1000 to scrap microseconds + region
// > "Sun Jul 04 2010 13:55:05 GMT-0700 (Pacific Daylight Time)"
new Date(1278276905502403 / 1000).toString()

我不能100%确定为什么15位时间戳上的最后一个数字丢失了,但重要的是,如果你能舍弃微秒和任何超过微秒的数字,前13位数字会给你一个正确的时间戳

处理此问题的通用方法是始终乘以毫秒,并丢弃其余的(javascript):


后两个时间戳在我看来像是错误,它们应该被忽略。你确定这些是你从API得到的确切值吗?看起来你可能让一个整数溢出发生在你的端…我看到15位时间戳也从api返回,相当频繁。我想可能是SMS/GMS编码的时间戳,但我还不确定
// Multiply by 1000 to include milliseconds
// > "Wed Jan 16 2008 08:12:06 GMT-0800 (Pacific Standard Time)"
new Date(1200499926 * 1000).toString();

// Divide by 100 to scrap the extraneous microseconds
// > "Sat May 02 2015 20:45:01 GMT-0700 (Pacific Daylight Time)"
new Date(143062470196222 / 100).toString();

// Divide by 1000 to scrap microseconds + region
// > "Sun Jul 04 2010 13:55:05 GMT-0700 (Pacific Daylight Time)"
new Date(1278276905502403 / 1000).toString()
let time = Number((1278276905502403 * 1000).toString().substring(0, 13))
let Date = new Date(time).toString()
// > "Sun Jul 04 2010 13:55:05 GMT-0700 (Pacific Daylight Time)"