【问题标题】:pymongo convert mongoDB date to python datetimepymongo 将 mongoDB 日期转换为 python 日期时间
【发布时间】:2020-05-26 02:51:52
【问题描述】:

我有一个 MongoDB 数据库,其中包含一些时间条目(例如,某些实体的创建日期)。当我在数据库中查看它们时,它们似乎是 64 位整数 BSON 格式。数据库条目最初是使用 C# (ASP.NET Core) 使用以下表示形式创建的:

[BsonRepresentation(MongoDB.Bson.BsonType.Decimal128)]

我想使用 Python 脚本访问该数据库以获取一些统计信息。我可以使用pymongo 在我的python 代码中获取该条目。典型值如下所示:[637013892303590646, 0]。如何将其转换为人类可读的 python datetime 值?

如果我打印从 pymongo 获得的变量类型,它会显示:bson.int64.Int64

我在这里查看了bson 模块文档:https://api.mongodb.com/python/current/api/bson/index.html,但我找不到合适的函数来进行转换。有人可以指点我正确的调用将bson.int64.Int64 转换为datetime 值吗?

谢谢!

【问题讨论】:

    标签: python-3.x mongodb datetime pymongo bson


    【解决方案1】:

    您的数据在ticks;定义为:

    这个属性的值代表100-纳秒的次数 自 0001 年 1 月 1 日午夜 12:00:00 以来经过的时间间隔 在公历中,代表 MinValue。它不是 包括可归因于闰秒的滴答数。如果 DateTime 对象的 Kind 属性设置为 Local,其刻度 表示自 1 月 1 日午夜 12:00:00 以来经过的时间, 0001 在当前时区设置指定的本地时间。 如果 DateTime 对象的 Kind 属性设置为 Utc,则其刻度 表示自 1 月 1 日午夜 12:00:00 以来经过的时间, 0001 在协调世界时。如果 DateTime 对象有其 Kind 属性设置为 Unspecified,其刻度表示经过的时间 时间从 0001 年 1 月 1 日午夜 12:00:00 开始,时间未知 区域。

    所以我们可以编写一个 ticks_to_datetime() 函数,它使用基于 0001 年 1 月 1 日午夜的时间增量,除以 10 以将 100 纳秒转换为微秒。

    import pymongo
    from datetime import datetime, timedelta
    from bson import Int64
    
    def ticks_to_datetime(ticks):
        return datetime(1, 1, 1) + timedelta(microseconds=ticks / 10)
    
    mydb = pymongo.MongoClient()['mydatabase']
    
    mydb.mycollection.insert_one({'old_time': [Int64(637013892303590646), 0]})
    record = mydb.mycollection.find_one({})
    old_time = record['old_time'][0]
    new_time = ticks_to_datetime(old_time)
    print(new_time)
    

    给予:

    2019-08-14 14:20:30.359062
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2019-05-09
      • 2021-10-23
      • 2015-08-19
      • 2010-12-28
      • 2017-12-18
      • 2017-05-14
      相关资源
      最近更新 更多