Запрос вывода даты и времени на mongodb для определенного часового пояса - PullRequest
4 голосов
/ 05 января 2012

У меня довольно простой вопрос. дата и время записи в коллекции сохраняются как

    "lastUpdated": ISODate("2011-12-07T02:46:51.101Z")

в формате GMT. Как запросить запись, чтобы вывод запроса, который я получаю, был в формате EST? возможно ли это в самом запросе или мне нужно вручную вычесть 5 часов (ESt = -5,00 часов)? Я использовал запрос:

    db.Collection.find({Type: 'Reports', patId: 'JOHNSONGARY'}, 
                       {'lastUpdated': 1} )

EDIT: Я использую Python для запросов и использую возвращенную метку времени как таковую;

    str(mongo_documents['lastUpdated'].strftime('%Y-%m-%d %H:%M:%S'))

Как вычесть 5 часов в этой команде?

Ответы [ 2 ]

6 голосов
/ 05 января 2012

Проверьте документацию - datetime объекты, возвращаемые pymongo, всегда представляют время в UTC, точно так же, как даты, хранящиеся в MongoDB, всегда сохраняются как (то есть предполагается, что в) UTC

pymongo может автоматически преобразовать ваши даты и время в часовой пояс, если вы установите флаг tz_info в True при создании вашего Connection. Затем вы можете использовать метод datetime.astimezone () для преобразования в другой часовой пояс, если хотите.

Так, например, вы можете использовать pytz для часовых поясов или, если вам нужен только EST, напишите свой собственный:

import datetime

class Eastern(datetime.tzinfo):

    def utcoffset(self, dt):
      return datetime.timedelta(hours=-5)

    def tzname(self, dt): 
        return "EST"

    def dst(self, dt):
        return datetime.timedelta(0)


EST = Eastern()

Тогда вы можете сделать это:

# Get now for EST
now = datetime.datetime.now(EST)
print now.strftime('%Y-%m-%d %H:%M:%S')

from pymongo import Connection
# Create a timezone aware connection
connection = Connection('localhost', 27017, tz_aware=True)

# Save your data
db = connection.test_database
db.stackoverflow.save({"Type": "reports", "patId": 'JOHNSONGARY', "lastUpdated": now})

doc = db.stackoverflow.find()[0]
print doc['lastUpdated'].astimezone(EST).strftime('%Y-%m-%d %H:%M:%S')

# Confirm they are the same
assert doc['lastUpdated'].astimezone(EST).strftime('%Y-%m-%d %H:%M:%S') == now.strftime('%Y-%m-%d %H:%M:%S')
0 голосов
/ 05 января 2012

Если вы используете C #, вы можете применить этот ответ .

Если вы используете Ruby, вам придется вычитать даты самостоятельно (или я не знаю о таком механизме).

Другие языки - понятия не имею: -)

...