- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有以下测试通过:
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/
我的应用程序生成 JSON 格式的日志。日志看起来像这样: {"LogLevel":"error","Datetime":"2013-06-21T11:20:17Z","Module":"DB","M
我正在编写一个 RScript 来将当前系统时间戳与 MongoDB 最后更新的时间戳进行比较。我的做法: db.runs.find().sort({'id':-1}).limit(1) - 给出最后
如何将字符串 "2015-02-02" 转换为 ISODate 2015-02-02T00:00:00.000Z?我试图找到一些例子,但没有找到。 最佳答案 您可以为此使用常规的 Javascript
我试图将正则表达式过滤器(年)应用于日期类型字段,但查询未返回任何结果。那么是不是试图了解此查询的行为? db.collection.find({"ReportedDate":/2016/i}) 注意
我正在执行测试以确保我正确获取日期。 我当前的测试是:选择 mongodb ISODate 格式的日期并将其转换为数值(自 1970 年以来的毫秒数),反之亦然 示例: var date_test =
我正在使用 MongoCursor 迭代集合并检索changeDate(ISODate 格式)。但是,使用 mongocursor 会以不同的格式返回数据。是否可以检索 ISODate 格式的chan
是否可以计算文档中两个日期之间的差异服务器端,并对其进行查询? (如SQL的DATEDIFF函数) 假设我有很多这样的文档: >>> db.collection.find() [ { "id"
我需要返回集合中每个用户的最小 client_timestamp 值,但是我无法让 $min 运算符以这种方式运行。有没有办法让查询返回集合中所有 user_ids 的最小 client_timest
我正在寻找来自 qt 的日期时间,以将字符串作为 isodate 但带有时区返回给我。我有时会在网上查看我的问题,但没有找到解决方案 我刚刚得到这个: this->ui.dateEnd->dateTi
为什么最后两个语句返回false? test:PRIMARY> a = new ISODate(); b = a; ISODate("2014-08-21T19:48:12.963Z") test:P
问题在 MongoDB 中将字符串解析为日期时,推荐的实现是什么? 我问这个是因为我们有供应商以“2017-01-01”和“2017/01/01”的格式向我们发送日期的字符串表示形式。我原以为使用 D
在集合中,我存储了这种文档: { "_id" : ObjectId("55e8a5cba21b9e051eb448d1"), "created_at" : "2015-01-01T00
我正在尝试使用 nodejs/mongoose 从 mongodb 获取结果。 var dateStr = new Date(year,month,day,0,0,0); var nextDate =
我正在尝试按小时聚合 MongoDB 集合中的记录,并且需要将存储为时间戳(毫秒)的日期转换为 ISODate,以便我可以使用聚合框架的内置日期运算符($hour、$month 等) 记录存储为 {
我正在尝试运行这个: mongoexport.exe -h *MYHOST* -p *MYPORT* -q "{'time':{'$gte': ISODate('2014-12-21 12:57:00
我似乎无法在 MongoDB 中使用最基本的日期查询。文档看起来像这样: { "_id" : "foobar/201310", "ap" : "foobar", "dt" :
我无法在 python 中导入 rdflib。错误详细信息: Python 2.7.3 (default, Jun 27 2012, 23:48:21) [GCC 4.6.1] on linux2 T
有谁知道一种更简洁的方法来将时区包含在 QDateTime 的 ISO 字符串表示中? 我应该可以使用以下内容: qDebug() #include int main(int argc, int
我有一个适用于 mongodb shell 的简单查询: db.collection.find({"date": {$lt: ISODate("2015-11-03T00:00:00Z")} }) 非
我从 ISODate 对象的 MongoDb 接口(interface)中丢失了纳秒。当我在 perl 中读取它们时,所有纳秒都设置为零。 首先是我的环境: MongoDB version: 1.8.
我是一名优秀的程序员,十分优秀!