python:将unix/posix纪元时间戳转换为日期时间(在mongodb之后,date_util json导出)
python: converting unix/posix epoch timestamp to datetime (after monogdb, date_util json export)
所以我收到了存储在 mongoDB 中的数据,然后通过 bson.json_util.dumps() 函数导出为 JSON。当我尝试将其重新转换回日期时间对象时,常用解析器的 none 工作。这是一个示例:
{
u'_group': 0,
u'_range': u'',
u'canon': 0,
u'comment_id': 0,
u'created': {u'$date': 1491468607000L},
u'description': u''
}
所有日期都如下所示:
[{u'$date': 1491457629000L}, {u'$date': 1491458993000L}, {u'$date': 1491457072000L}, {u'$date': 1491457035000L}, {u'$date': 1491457330000L}, {u'$date': 1491458323000L}, {u'$date': 1491458147000L}, {u'$date': 1491458277000L}, {u'$date': 1491459839000L}, {u'$date': 1491466340000L}, {u'$date': 1491463804000L}, {u'$date': 1491464304000L}, {u'$date': 1491465145000L}, {u'$date': 1492073749000L}, {u'$date': 1492073750000L}, {u'$date': 1492075415000L}, {u'$date': 1492155813000L}, {u'$date': 1492608582000L}, {u'$date': 1492671698000L}, {u'$date': 1493001047000L}, {u'$date': 1493714117000L}]
我的测试:
y = {u'$date': 1491457629000L}
>>> y['$date']
1491457629000L
以及各种失败的尝试:
print(
datetime.datetime.fromtimestamp(
y['$date']
).strftime('%Y-%m-%d %H:%M:%S')
)
ValueError: timestamp out of range for platform localtime()/gmtime() function
from dateutil import parser
parser.parse(str(y['$date']))
OverflowError: Python int too large to convert to C long
utc_time = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=y['$date'])
OverflowError: date value out of range
似乎任何 unix 时间戳转换器都应该能够读取它。为什么它不起作用?我也只需要年份和月份,所以时区特异性不在我的要求范围内。
注意(给反对者):这不是 converting epoch time with milliseconds to datetime 的副本,因为这里的解决方案是使用不同的 JSON 解析器,该解析器反映了它从 [=41 转换出来的方式=],而不是尝试使用不相关的时间戳解析器重新格式化它。我已经研究了另一个 link,发现它没有解决我的问题。
您是否尝试过删除最后 3 个零(除以 1000)?
错误似乎来自转换,您的值可能以毫秒为单位,python datetime.datetime.fromtimestamp
似乎需要几秒。
这成功了。我不知道为什么这种特殊的时间戳格式不能用其他工具转换,
{u'$date': 1491457629000L}
但是用它自己对应的 json_util.loads()
方法反转 json_util.dumps()
方法是可行的。它必须对请求的数据执行此操作,而不是使用 python 的 requests
模块中的标准 .json() 方法:
from bson import json_util
import requests
raw = requests.get('someurlhere')
data = json_util.loads(raw.text)
{...
u'created': datetime.datetime(2017, 4, 6, 5, 47, 9, tzinfo=<bson.tz_util.FixedOffset object at 0x0000000002FAAC18>),
...}
这会生成一个日期时间对象,我可以使用它。
所以我收到了存储在 mongoDB 中的数据,然后通过 bson.json_util.dumps() 函数导出为 JSON。当我尝试将其重新转换回日期时间对象时,常用解析器的 none 工作。这是一个示例:
{
u'_group': 0,
u'_range': u'',
u'canon': 0,
u'comment_id': 0,
u'created': {u'$date': 1491468607000L},
u'description': u''
}
所有日期都如下所示:
[{u'$date': 1491457629000L}, {u'$date': 1491458993000L}, {u'$date': 1491457072000L}, {u'$date': 1491457035000L}, {u'$date': 1491457330000L}, {u'$date': 1491458323000L}, {u'$date': 1491458147000L}, {u'$date': 1491458277000L}, {u'$date': 1491459839000L}, {u'$date': 1491466340000L}, {u'$date': 1491463804000L}, {u'$date': 1491464304000L}, {u'$date': 1491465145000L}, {u'$date': 1492073749000L}, {u'$date': 1492073750000L}, {u'$date': 1492075415000L}, {u'$date': 1492155813000L}, {u'$date': 1492608582000L}, {u'$date': 1492671698000L}, {u'$date': 1493001047000L}, {u'$date': 1493714117000L}]
我的测试:
y = {u'$date': 1491457629000L}
>>> y['$date']
1491457629000L
以及各种失败的尝试:
print(
datetime.datetime.fromtimestamp(
y['$date']
).strftime('%Y-%m-%d %H:%M:%S')
)
ValueError: timestamp out of range for platform localtime()/gmtime() function
from dateutil import parser
parser.parse(str(y['$date']))
OverflowError: Python int too large to convert to C long
utc_time = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=y['$date'])
OverflowError: date value out of range
似乎任何 unix 时间戳转换器都应该能够读取它。为什么它不起作用?我也只需要年份和月份,所以时区特异性不在我的要求范围内。
注意(给反对者):这不是 converting epoch time with milliseconds to datetime 的副本,因为这里的解决方案是使用不同的 JSON 解析器,该解析器反映了它从 [=41 转换出来的方式=],而不是尝试使用不相关的时间戳解析器重新格式化它。我已经研究了另一个 link,发现它没有解决我的问题。
您是否尝试过删除最后 3 个零(除以 1000)?
错误似乎来自转换,您的值可能以毫秒为单位,python datetime.datetime.fromtimestamp
似乎需要几秒。
这成功了。我不知道为什么这种特殊的时间戳格式不能用其他工具转换,
{u'$date': 1491457629000L}
但是用它自己对应的 json_util.loads()
方法反转 json_util.dumps()
方法是可行的。它必须对请求的数据执行此操作,而不是使用 python 的 requests
模块中的标准 .json() 方法:
from bson import json_util
import requests
raw = requests.get('someurlhere')
data = json_util.loads(raw.text)
{...
u'created': datetime.datetime(2017, 4, 6, 5, 47, 9, tzinfo=<bson.tz_util.FixedOffset object at 0x0000000002FAAC18>),
...}
这会生成一个日期时间对象,我可以使用它。