¿Cómo puedo configurar la zona horaria de una instancia de datetime que acaba de salir del almacén de datos?

Cuando lo primero que sale es en UTC. Quiero cambiar a EST.

Estoy tratando, por ejemplo:

class Book( db.Model ):
    creationTime = db.DateTimeProperty()

Cuando un Libro se recupera, quiero establecer su tzinfo de inmediato:

book.creationTime.tzinfo = EST

Donde Yo uso este ejemplo para mi EST objeto

Sin embargo puedo obtener:

atributo 'tzinfo' de 'datetime.datetime' objetos no es modificable 

He visto un número de respuestas que se recomienda pytz y python-dateutil, pero realmente quiero una respuesta a esta pregunta.

InformationsquelleAutor bobobobo | 2010-01-18

3 Comentarios

  1. 50

    datetime‘s objetos son inmutables, por lo que nunca cambia cualquiera de sus atributos de hacer una nueva objeto con algunos de los atributos de la misma, y algunas diferentes, y asignarlo a todo lo que necesitas para asignar.

    I. e., en su caso, en lugar de

    book.creationTime.tzinfo = EST

    usted tiene el código

    book.creationTime = book.creationTime.replace(tzinfo=EST)
    • nota: no convierte a partir de la hora UTC para que EST en la zona horaria («es la primera que sale es en UTC. Quiero cambiar a EST.»). El tiempo que permanece el mismo. Para convertir, book.creationTime.astimezone(EST) podría ser utilizado.
  2. 6

    Si usted está recibiendo un datetime que en EST, pero no tiene su tzinfo campo de juego, el uso de dt.replace(tzinfo=tz) para asignar un tzinfo sin modificar el tiempo. (La base de datos debería estar haciendo esto para usted.)

    Si usted está recibiendo un datetime que en la UDT, y quiere que en EST, entonces usted necesita astimezone. http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

    En la gran mayoría de los casos, la base de datos se deben almacenar y devolver los datos en la UDT, y que no es necesario el uso de reemplazar (excepto posiblemente para asignar un UDT tzinfo).

    • Por ‘UDT’ que significa ‘UTC’, ¿correcto?
  3. 0

    Lo que quiero es que justo allí, en la docs.

    from datetime import tzinfo, timedelta, datetime
    ZERO = timedelta(0)
    HOUR = timedelta(hours=1)
    DSTSTART = datetime(1, 4, 1, 2)
    DSTEND = datetime(1, 10, 25, 1)
    def first_sunday_on_or_after(dt):
    days_to_go = 6 - dt.weekday()
    if days_to_go:
    dt += timedelta(days_to_go)
    return dt
    class USTimeZone(tzinfo):
    def __init__(self, hours, reprname, stdname, dstname):
    self.stdoffset = timedelta(hours=hours)
    self.reprname = reprname
    self.stdname = stdname
    self.dstname = dstname
    def __repr__(self):
    return self.reprname
    def tzname(self, dt):
    if self.dst(dt):
    return self.dstname
    else:
    return self.stdname
    def utcoffset(self, dt):
    return self.stdoffset + self.dst(dt)
    def dst(self, dt):
    if dt is None or dt.tzinfo is None:
    # An exception may be sensible here, in one or both cases.
    # It depends on how you want to treat them.  The default
    # fromutc() implementation (called by the default astimezone()
    # implementation) passes a datetime with dt.tzinfo is self.
    return ZERO
    assert dt.tzinfo is self
    # Find first Sunday in April & the last in October.
    start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year))
    end = first_sunday_on_or_after(DSTEND.replace(year=dt.year))
    # Can't compare naive to aware objects, so strip the timezone from
    # dt first.
    if start <= dt.replace(tzinfo=None) < end:
    return HOUR
    else:
    return ZERO
    now = datetime.now()
    print now
    print now.tzinfo
    Eastern = USTimeZone(-5, 'Eastern', 'EST', 'EDT')
    now_tz_aware = now.replace(tzinfo=Eastern)
    print now_tz_aware

    de salida:

    2010-01-18 17:08:02.741482
    None
    2010-01-18 17:08:02.741482-05:00
    • Eso no es muy informativo. Usted podría haber explicado como mucho por decir para usar datetime.reemplazar(tzinfo=…) – pero no has explicado cómo se supone que para OBTENER la tzinfo él quiere, usted simplemente han codificado un EST/EDT zona horaria.

Dejar respuesta

Please enter your comment!
Please enter your name here