[英]Convert MongoDB BsonTimestamp to C# DateTime
將BsonTimestamp字段轉換為C#DateTime類型的正確方法是什么?
這用於MongoDB的oplog集合中的數據,並使用MongoDB C#驅動程序。
我相信,由於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位置。
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
兩個構造函數中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
)是一個序號,根據MongoDB參考 ,它使Timestamp
唯一,因此您應該使用我認為的Timestamp
屬性。
如果使用的是BSON文檔:
DateTime dateTime = doc["BSONdateTime"].AsDateTime;
其中“ dateTime”是要設置的變量,“ doc”是您從MongoDB中提取的BSON文檔,“ BSONdateTime”是您要從中提取日期和時間的鍵。
我自己沒有嘗試過,但是我能夠使用以下方法從MongoDB中的BSON文檔中提取字符串值:
string name = doc["name"].AsString;
我還建議您研究POCO,因為這使類型轉換變得更加容易並且減少了樣板。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.