Проблемы с часовым поясом с MongoDB и NodeJs - PullRequest
0 голосов
/ 27 февраля 2020

Итак, проблема, с которой я сейчас сталкиваюсь:

У меня есть список занятий в тренажерном зале, у каждого из которых есть открытие. Я хочу получить все классы с текущего дня, но. Я не получаю тот же результат локально и в производстве, потому что по какой-то причине, когда я развертываю свой бэкэнд в Heroku, часовой пояс устанавливается по умолчанию в UT C (когда у меня часовой пояс GMT-3).

Вот мой запрос:

 var now = moment();

 var startOfDay = now.startOf('day').format();

 var endOfDay = now.endOf('day').format();

 var clasesDB = await Clase.find({ $and: [{ openingTime: { $gte: startOfDay } }, { openingTime: { $lte: endOfDay } }] })

Итак, как я уже говорил, проблема возникает, когда, например:

Когда я выбираю классы в моем локальном время (например: 02-26-19 21: 00hs (GMT-3)), запросы фактически показывают классы из 02-27 , потому что в MINE 21: 00hs на стороне сервера уже 00:00, так что дата больше не 02-26 . И я не хочу такой вывод.

Как я могу обойти это решение?

Заранее спасибо! :)

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Не используйте .format(), это делает строку . Сравнивайте непосредственно Date значения, т.е. используйте

var now = moment();

var startOfDay = now.startOf('day').toDate();    
var endOfDay = now.endOf('day').toDate();

По умолчанию moment использует местное время, поэтому moment().startOf('day') возвращает полночь местного времени. Если вы хотите получить полночь UT C, используйте moment.utc().startOf('day').

Если вы не полагаетесь на «местный» часовой пояс, вы можете указать его как moment.tz("America/New_York").startOf('day')

Независимо от того, в какое время вам нужно, никогда сравнивать значения даты по строке, всегда используйте действительное Date значение.

1 голос
/ 27 февраля 2020

По умолчанию в MongoDB поле даты сохраняется в UT C. Вы можете создать дату со смещением во время записи, чтобы сохранить ее в вашей временной зоне. Но вы не сделали этого во время написания документов, тогда вам нужно преобразовать поле даты в нужный вам часовой пояс при чтении данных из базы данных. Проверьте этот пример ниже.

JavaScript Код:

const today = new Date().toLocaleDateString(undefined, {
    day: '2-digit',
    month: '2-digit',
    year: 'numeric'
})  // 02/26/2020. If your Heroic server is in different location then specify your locale in place of undefined - whereas undefined picks local time by default. Ex:- 'en-Us' for USA

Запрос:

db.collection.aggregate([
    { $addFields: { timewithOffsetNY: { $dateToString: { format: "%m/%d/%Y", date: "$openingTime", timezone: "America/New_York" } } } },
    { $match: { timewithOffsetNY: today } }, { $project: { timewithOffsetNY: 0 } }
])

Над запросом написано для нью-йоркского timeZone, вы можете конвертировать его в соответствии с вашим timeZone, в тестовом URL вы можете увидеть, что 1st do c не возвращается, хотя он находится на 2020-02-26, поскольку смещение в New York на сегодняшний день составляет 5 часов, поэтому после дата конвертирования становится 2020-02-25.

Тест: MongoDB-Playground

Ссылка: $ dateToString

...