为什么$ dateToString(聚合)将日期转换的日期短了1天?

时间:2020-01-25 03:34:01

标签: mongodb aggregation-framework

我有这份文件

{
  'datetime_expiration': 2020-01-01T00:00:00.000+00:00
  'id_profile': 1
}

当我将字段datetime_expiration转换为字符串时

{
'$project': {
  'datetime_expiration': {
      '$dateToString': {
        'date': '$datetime_expiration',
        'format': '%Y-%m-%d',
        'timezone': 'America/Sao_Paulo',
        'onNull': null
      }
   }
 }
}

mongo减去一天。结果:

{
  'datetime_expiration': '2019-12-31'
  'id_profile': 1
}

如您所见,在'$project'之前我们有2020-01-01,但在2019-12-31之后。 为什么会这样呢?我在巴西。

1 个答案:

答案 0 :(得分:1)

这是因为默认情况下所有日期都以UTC格式编写-请在此处检查:: MongoDB-Date,对于$dateToString,当您经过类似'timezone': 'America/Sao_Paulo'的时区时,它将从传入UTC日期时间,然后为您提供日期。由于您的时区为UTC-3,因此将从2020-01-01T00:00:00.000+00:00中减去3个小时,结果为2019-12-31T21:00:00.000+00:00,因此日期将为'2019-12-31'-如果您需要原样的日期,不要指定时区。

摘自$dateToString的时区选项文档:

时区是可选的。运算结果的时区。一定是 一个有效的表达式,可解析为格式为 Olson时区标识符或UTC偏移量。如果未提供时区, 结果以UTC显示。

参考: $dateToString