gpt4 book ai didi

c# - Mongodb c#驱动和ISODate

转载 作者:IT老高 更新时间:2023-10-28 13:26:13 25 4
gpt4 key购买 nike

我有以下测试通过:

namespace MongoDateTest
{

[TestFixture]
public class DateTesting
{
public class TestEntity
{
public string Id { get; set; }
public string StringTest { get; set; }
public DateTime DateTest { get; set; }

}
[Test]
public void MongoDateConversion()
{
const string connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
var database = server.GetDatabase("test");
var collection = database.GetCollection<TestEntity>("entities");
var entity = new TestEntity {
Id = "1",
StringTest = "Test",
DateTest = new DateTime(2013, 10, 13) //this is the date
};
collection.Save(entity);
var id = entity.Id;
var query = Query<TestEntity>.EQ(e => e.Id, id);
var entityNew = collection.FindOne(query);
Assert.AreEqual(entityNew.Id, entity.Id);
Assert.AreEqual(entity.StringTest, entityNew.StringTest);

//Assert.AreEqual(entity.DateTest,entityNew.DateTest);
// This gives one day error:
// Expected: 2013-10-13 00:00:00.000
// But was: 2013-10-12 22:00:00.000
//Assert.AreEqual(entity.DateTest.ToLocalTime(),entityNew.DateTest.ToLocalTime());
// This gives a 2 hours error.
// Expected: 2013-10-13 02:00:00.000
// But was: 2013-10-13 00:00:00.000
Assert.AreEqual(entity.DateTest, entityNew.DateTest.ToLocalTime());
}
}
}

如果我取消对任何 Asserts.AreEqual 的注释,我会收到错误消息(在下方注释)。

保存的实体是:

{
"_id" : "1",
"StringTest" : "Test",
"DateTest" : ISODate("2013-10-12T22:00:00Z")
}

我知道这可能与 ISODate 和 UTC(我在 UTC+1)有关,但我有点恼火的是我的日期在集合中保存了一天的差异,并且要求我随时转换为 localTime获取一些带有日期的数据。

这种行为的原因是什么,有没有办法避免它?

最佳答案

在大多数情况下,您希望将 UTC 日期时间存储在数据库中,因此您的 DateTime 应构造为:-

DateTest = new DateTime(2013, 10, 13, 0, 0, 0, DateTimeKind.Utc) //this is the date

有了这个,你的第一个注释单元测试现在通过了。

如果不指定 DateTimeKind,您将任其选择。 MongoDB 似乎假定它是本地的,并将其转换为数据库中的 UTC。

另请注意,MongoDB DateTime 值的精度低于 .NET DateTime 值。如果您想存储任意 DateTime 值并以它们仍然匹配的方式取回它们,那么您需要在存储它们之前将它们四舍五入到最接近的毫秒。

如果您确实想存储本地时间,我建议您从 DateTime 切换到 DateTimeOffset 并将其序列化为 UTC DateTime 的长 Tick 值和偏移量。

请注意,除非您存储在获取 DateTime 值时计算的偏移量,否则转换为 LocalTime 的 .NET 方法基本上是无用的,因为它们不知道夏令时何时开始,甚至也不知道哪个区域DateTime 值来自哪里。总的来说,.NET DateTime 处理还有很多不足之处,并且包含许多声称有帮助但实际上没有帮助的误导性方法。

关于c# - Mongodb c#驱动和ISODate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19350348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com