当我通过C#驱动程序存储本地日期时,MongoDb返回UTC日期时间
MongoDb:3.2 x64 C#驱动程序:官方C#驱动程序2.2 在我编写了TestClass的一个实例之后,然后检索它。我发现“数据时间”字段已更改为UTC日期时间 当然,我知道c#驱动程序使用UTC格式编写日期时间,但它非常适合自动将其转换为UTC,当我从mongo检索它时,什么也不做 我使用了“samus”驱动程序,之前在向mongo写入数据时将DateTime转换为UTC格式,在检索数据时将其转换为本地DateTime 以下是测试代码:当我通过C#驱动程序存储本地日期时,MongoDb返回UTC日期时间,c#,mongodb,datetime,mongodb-.net-driver,C#,Mongodb,Datetime,Mongodb .net Driver,MongoDb:3.2 x64 C#驱动程序:官方C#驱动程序2.2 在我编写了TestClass的一个实例之后,然后检索它。我发现“数据时间”字段已更改为UTC日期时间 当然,我知道c#驱动程序使用UTC格式编写日期时间,但它非常适合自动将其转换为UTC,当我从mongo检索它时,什么也不做 我使用了“samus”驱动程序,之前在向mongo写入数据时将DateTime转换为UTC格式,在检索数据时将其转换为本地DateTime 以下是测试代码: using System; using Mic
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MongoDB;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
namespace Test
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var client = new MongoClient("mongodb://root:root@127.0.0.1");
var db = client.GetDatabase("Test");
var col = db.GetCollection<TestClass>("TestClass");
var data = new TestClass(DateTime.Now.ToString());
col.InsertOne(data);
var find = Builders<TestClass>.Filter.Eq("_id", data.DataTime);
var fo = new FindOptions<TestClass>();
fo.Limit = 1;
var t = col.FindSync(find, fo);
var data_ret = t.ToList()[0];
Assert.AreEqual(data.Text, data_ret.Text);
Assert.AreEqual(data.DataTime, data_ret.DataTime);
}
}
public class TestClass
{
public TestClass()
{
}
public TestClass(string arg_strText)
{
DataTime = DateTime.Parse(DateTime.Now.ToString());
Text = arg_strText;
}
[BsonId]
public DateTime DataTime;
public string Text;
}
}
使用系统;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用MongoDB;
使用MongoDB.Bson;
使用MongoDB.Bson.Serialization.Attributes;
使用MongoDB.Driver;
名称空间测试
{
[测试类]
公共类UnitTest1
{
[测试方法]
公共void TestMethod1()
{
var客户端=新的MongoClient(“mongodb://root:root@127.0.0.1");
var db=client.GetDatabase(“测试”);
var col=db.GetCollection(“TestClass”);
var data=newtestclass(DateTime.Now.ToString());
InsertOne上校(数据);
var find=Builders.Filter.Eq(“\u id”,data.DataTime);
var fo=新的FindOptions();
fo.Limit=1;
var t=col.FindSync(find,fo);
var data_ret=t.ToList()[0];
Assert.AreEqual(data.Text、data_ret.Text);
Assert.AreEqual(data.DataTime,data_ret.DataTime);
}
}
公共类TestClass
{
公共测试类()
{
}
公共测试类(字符串arg\u strText)
{
DataTime=DateTime.Parse(DateTime.Now.ToString());
Text=arg_strText;
}
[BsonId]
公共日期时间数据时间;
公共字符串文本;
}
}
MongoDB仅存储UTC数据。因此,您可以自己小心地转换它,或者您可以告诉驱动程序您希望使用本地日期时间,而驱动程序会为您这样做(存储时转换为utc,读取时转换为utc)。为此,您需要注册预定义的序列化程序
BsonSerializer.RegisterSerializer(typeof(DateTime),
new DateTimeSerializer(DateTimeKind.Local));
正如您所提到的,MongoDB总是以UTC存储日期时间,所以当您读回它时,为什么您会期望UTC之外的任何东西?输入日期是本地的这一事实在转换为UTC的过程中丢失了。@johnyhk我应该检索与我所写内容相同的人员。所以我对官方司机的行为感到困惑。samus driver所做的匹配“相等”标尺。当然,但你明白发生了什么,对吗?即使使用
UtcNow
值,对DataTime
的断言也会失败,因为C#time的分辨率高于BSON日期。所以这里发生了很多事情。samus驱动程序已经6年没有更新了,所以这不是一个很好的参考资料。:-)如果数据是由在美国运行mongodb驱动程序的应用程序写入的,然后由在亚洲运行的应用程序读取数据,我假设原始写入数据丢失了?