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

时间:2017-06-14 12:54:17

标签: 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']

或者这个:

>>> 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']

请帮助我正确地将这些类型的时间戳转换为字符串,或者这些时间戳有问题吗?

更新

>>> InstagramAPI.searchLocation('High Castle')
>>> location_id = InstagramAPI.LastJson['items'][0]['location']['pk']
>>> InstagramAPI.getLocationFeed(location_id)
>>> print(InstagramAPI.LastJson['items'][9]['device_timestamp'], InstagramAPI.LastJson['items'][9]['taken_at'])
77276011342 1497443715

如果有15位数字,请打印:

186693871989665 1497381289

所以似乎有时候' device_timestamp' InstagramAPI给了我,我不确定,但看起来像用户设备拍摄照片的时间和手机上的时间不正确,但是看起来像是' taken_at'似乎返回了正确的时间戳,所以我现在就使用它,但是请求帮助。如果您对此有不同的答案,我希望看到它。

1 个答案:

答案 0 :(得分:2)

在使用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()
  

请注意

     

我不是百分之百确定为什么15位数字时间戳上的最后一位数字丢失但重要的是如果你可以丢弃微秒及其他任何数字,前13位数字会给你一个正确的时间戳

处理这种情况的一种通用方法是总是乘以毫秒并丢弃其余的(javascript):

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)"