将 MongoDB BsonTimestamp 转换为 C# DateTime
Convert MongoDB BsonTimestamp to C# DateTime
将 BsonTimestamp 字段转换为 C# DateTime 类型的正确方法是什么?
这是针对 MongoDB 的 oplog 集合中的数据并使用 MongoDB C# 驱动程序。
MongoDB 的 Timestamp
是自 Unix 纪元 (1970/1/1) 以来经过的秒数。
因此,从Timestamp
到DateTime
的转换是这样的:
DateTime datetime = new DateTime(1970, 1, 1).AddSeconds(bsonTimestamp.Timestamp);
就 Value
/ Timestamp
属性而言,它们在 https://github.com/mongodb/mongo-csharp-driver 的 BsonTimestamp
的两个构造函数中实现。
构造函数 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
) 是使 Timestamp
根据 MongoDB reference 唯一的序数,您应该使用 Timestamp
属性我觉得。
如果您使用的是 BSON 文档:
DateTime dateTime = doc["BSONdateTime"].AsDateTime;
其中"dateTime"是你要设置的变量,"doc"是你从MongoDB中提取的BSON文档,"BSONdateTime"是你想要的键从中提取日期和时间。
我自己还没有尝试过,但是我能够使用以下方法从 MongoDB 中的 BSON 文档中提取字符串值:
string name = doc["name"].AsString;
我还建议您查看 POCO,因为这使得类型转换更容易,样板更少。
希望对您有所帮助!
我认为接受的答案略有偏差,因为 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。
将 BsonTimestamp 字段转换为 C# DateTime 类型的正确方法是什么?
这是针对 MongoDB 的 oplog 集合中的数据并使用 MongoDB C# 驱动程序。
MongoDB 的 Timestamp
是自 Unix 纪元 (1970/1/1) 以来经过的秒数。
因此,从Timestamp
到DateTime
的转换是这样的:
DateTime datetime = new DateTime(1970, 1, 1).AddSeconds(bsonTimestamp.Timestamp);
就 Value
/ Timestamp
属性而言,它们在 https://github.com/mongodb/mongo-csharp-driver 的 BsonTimestamp
的两个构造函数中实现。
构造函数 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
) 是使 Timestamp
根据 MongoDB reference 唯一的序数,您应该使用 Timestamp
属性我觉得。
如果您使用的是 BSON 文档:
DateTime dateTime = doc["BSONdateTime"].AsDateTime;
其中"dateTime"是你要设置的变量,"doc"是你从MongoDB中提取的BSON文档,"BSONdateTime"是你想要的键从中提取日期和时间。
我自己还没有尝试过,但是我能够使用以下方法从 MongoDB 中的 BSON 文档中提取字符串值:
string name = doc["name"].AsString;
我还建议您查看 POCO,因为这使得类型转换更容易,样板更少。
希望对您有所帮助!
我认为接受的答案略有偏差,因为 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。