0

我实际上是通过 tLibraryLoad 组件使用 mongDB API,因为我发现使用 tJavaRow 和 tJava 组件构建复杂的多级文档比使用 MongoDB 调色板组件更容易。

我正在从 Oracle 读取数据,这些数据是具有零时间戳组件的日期值:例如:

2008 年 6 月 29 日 00.00.00

导入通过 Talend 进行,但 mongo shell 中的记录似乎是前一天。您可以看到插入的记录为 28-JUN-2008。

从 mongoDB 中的 JSON 文档中提取:

“状态日期”:ISODate(“2008-06-28T23:00:00Z”)

就好像 mongoDB(或 Talend?)将午夜日期视为前一天的结束,而不是 2008 年 6 月 29 日的开始。

在我的 Talend 架构中,我已将 Oracle 列指定为日期类型,数据库类型也为日期。

任何建议表示赞赏。

--- 更新 1-------- 由于只有一些日期受到影响,这似乎是 mongoDB 中的 DST 调整,可能将显示调整到我当地的时区,因为受影响的日期在后半部分夏令时的一年。

是否由于 mongo shell 的位置而调整日期?

由于 mongo 服务器的位置,它正在调整日期,所以所有使用 mongo shell 的人都会得到相同的日期查询答案?

不同的人在日期上运行不同的 mongo 查询会根据他们的位置得到不同的结果吗?他们的 DST 开始日期......你可以想象从 2015 年 11 月 1 日开始的日期,被算作对 10 月 31 日数据的贡献(在 23:00) ……

一世

4

2 回答 2

1

我感觉到你的痛苦——这源于 MongoDB 本身。

问题是 MongoDB 默认以 UTC 格式存储日期。

https://docs.mongodb.org/manual/tutorial/model-time-data/

您可以使用上面的 Mongo 建议,但在这种情况下,您只存储日期而不是时间。我使用了两种解决方案:

  1. 不要费心将日期存储为 DATE。将所有日期转换为 %Y%m%d 格式并将它们存储为整数。您可以使用 $gt 和 $lte 轻松比较日期,只需使用整数 - 只需确保使用相同格式输入您的日期,然后稍后将它们转换回您的程序中。

... 或者 ...

  1. 由于在您的情况下,您的日期似乎偏离了一个小时,因此在插入之前添加一个小时。这完全取决于时区偏移到您的本地计算机的时间。

在 linux 上,您可以看到 utc 值使用的是什么:

date -u

我想您可以将您机器上的本地时区更改为 UTC 时间,然后看看会发生什么。

就个人而言,我从来没有遇到过使用第一种方法的问题。它很快,并确保我有我想要的东西。

于 2016-01-06T19:11:43.083 回答
0

我认为这是因为您的服务器的时区。尝试从您的日期对象中删除时区,然后将其插入到 mongodb。

使用 moment.js,您可以通过以下方式创建没有时区的日期:

var date = moment.utc("29-JUN-08 00.00.00", 'DD-MM-YYYY h.mm.s').format()
于 2016-01-06T18:37:31.980 回答