Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我通过C#驱动程序存储本地日期时,MongoDb返回UTC日期时间_C#_Mongodb_Datetime_Mongodb .net Driver - Fatal编程技术网

当我通过C#驱动程序存储本地日期时,MongoDb返回UTC日期时间

当我通过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

MongoDb:3.2 x64 C#驱动程序:官方C#驱动程序2.2

在我编写了TestClass的一个实例之后,然后检索它。我发现“数据时间”字段已更改为UTC日期时间

当然,我知道c#驱动程序使用UTC格式编写日期时间,但它非常适合自动将其转换为UTC,当我从mongo检索它时,什么也不做

我使用了“samus”驱动程序,之前在向mongo写入数据时将DateTime转换为UTC格式,在检索数据时将其转换为本地DateTime

以下是测试代码:

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驱动程序的应用程序写入的,然后由在亚洲运行的应用程序读取数据,我假设原始写入数据丢失了?