将MongoDB BsonTimestamp转换为C#DateTime

时间:2015-10-29 20:05:25

标签: c# datetime mongodb-csharp-2.0

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

这是针对MongoDB的oplog集合中的数据并使用MongoDB C#驱动程序。

3 个答案:

答案 0 :(得分:2)

我认为接受的答案稍微偏离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。

答案 1 :(得分:1)

MongoDB的Timestamp是自Unix纪元(1970/1/1)以来经过的秒数。 因此,从TimestampDateTime的转换如下:

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

Value / Timestamp属性而言,它们在https://github.com/mongodb/mongo-csharp-driverBsonTimestamp的两个构造函数中都有所体现。

构造函数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) 

由于第二个号码(increment)是根据MongoDB reference使Timestamp唯一的序号,您应该使用我认为的Timestamp属性。

答案 2 :(得分:1)

如果您使用的是BSON文件:

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

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

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

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

我还建议您研究POCO,因为这样可以更轻松地进行类型转换,并减少样板。

希望这有帮助!