Почему $ dateToString (агрегат) конвертировал дату на 1 день меньше? - PullRequest
1 голос
/ 25 января 2020

У меня есть этот документ

{
  '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
      }
   }
 }
}

mon go вычитает один день. Результат:

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

Как видите, до '$project' у нас было 2020-01-01, а после 2019-12-31. Почему это происходит? Я в Бразилии.

1 Ответ

1 голос
/ 25 января 2020

Это потому, что все даты записываются в UT C по умолчанию - отметьте здесь: * MongoDB-Date , для $dateToString, когда вы передаете часовой пояс, подобный этому 'timezone': 'America/Sao_Paulo', тогда он удалит смещение от UT C дата-время, переданное в & затем дать вам дату. Поскольку ваш часовой пояс равен UTC-3, он вычтет 3 часа из 2020-01-01T00:00:00.000+00:00, что означает 2019-12-31T21:00:00.000+00:00, поэтому дата будет '2019-12-31' - в случае, если вам нужна дата как есть, не указывайте часовой пояс.

Из документации по часовому поясу опция $dateToString:

часовой пояс является опциональной. Часовой пояс результата операции. должно быть допустимым выражением, которое преобразуется в строку, отформатированную как идентификатор часового пояса Олсона или смещение UT C. Если часовой пояс не указан, результат отображается в формате UT C.

Ref: $ dateToString

...