0

将 BsonTimestamp 字段转换为 C# DateTime 类型的正确方法是什么?

这适用于 MongoDB 的 oplog 集合中的数据并使用 MongoDB C# 驱动程序。

4

3 回答 3

3

我相信接受的答案略有偏差,因为Unix Epoch必须是 UTC 格式。

var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

从 BsonTimestamp 到 DateTime

var target = unixEpoch.AddSeconds(bsonTimestamp.Timestamp - 18000);

从 DateTime 到 BsonTimestamp

var target = DateTime.UtcNow;
var diff = target.ToUniversalTime() - unixEpoch;
var seconds = (diff.TotalMilliseconds + 18000000) / 1000;
var ts = new BsonTimestamp((int)seconds, 1);

您需要使用target.ToUniversalTime()来确保传入参数(如果有)始终定位为 UTC。

于 2017-05-23T16:23:18.533 回答
2

MongoDBTimestamp是自 Unix 纪元 (1970/1/1) 以来经过的秒数。因此,从Timestampto的转换DateTime是这样的:

DateTime datetime = new DateTime(1970, 1, 1).AddSeconds(bsonTimestamp.Timestamp);

Value/Timestamp属性而言,它们 BsonTimestamphttps://github.com/mongodb/mongo-csharp-driver的两个构造函数中都实现了。

构造函数 1:

public BsonTimestamp(long value)
{
    _value = value;
}

构造函数 2:

public BsonTimestamp(int timestamp, int increment)
{
    _value = (long)(((ulong)(uint)timestamp << 32) | (ulong)(uint)increment);
}

财产:

public long Value
{
    get { return _value; }
}

public int Timestamp
{
    get { return (int)(_value >> 32); }
}

由于您是从 oplog 获取时间戳记录,因此它们的格式如下:

Timestamp(1406171938, 1) 

由于第二个数字( )是一个序数,根据MongoDB 参考increment来使唯一,你应该使用我认为的属性。TimestampTimestamp

于 2015-10-29T20:21:48.480 回答
1

如果您使用的是 BSON 文档:

DateTime dateTime = doc["BSONdateTime"].AsDateTime;

其中“dateTime”是您要设置的变量,“doc”是您从 MongoDB 中提取的 BSON 文档,“BSONdateTime”是您要从中提取日期和时间的键。

我自己没有尝试过,但是我能够使用以下方法从 MongoDB 中的 BSON 文档中提取字符串值:

string name = doc["name"].AsString;

我还建议您研究 POCO,因为这使类型转换更容易且样板更少。

希望这可以帮助!

于 2015-10-29T20:28:48.133 回答