簡體   English   中英

將MongoDB BsonTimestamp轉換為C#DateTime

[英]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)起經過的秒數。 因此,從TimestampDateTime的轉換是這樣的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM