Comment créer tzinfo lorsque J'ai UTC offset?

j'ai un fuseau horaire le décalage de l'heure UTC en quelques secondes (19800) et aussi l'avoir dans un format de chaîne - +0530.

Comment puis-je les utiliser pour créer un tzinfo exemple? J'ai regardé dans pytz, mais là je n'ai pu trouver que des API qui prennent le nom de timezone comme input.

21
demandé sur Jon Clements 2013-07-31 20:37:35

5 réponses

Si vous le pouvez, prenez un coup d'oeil à l'excellent dateutil package au lieu de l'implémenter vous-même.

plus Précisément, tzoffset. C'est un fixe décalage tzinfo instance initialisée avec offset, donné en secondes, ce que vous cherchez.

mise à Jour

Voici un exemple. Assurez-vous de courir pip install python-dateutil en premier.

from datetime import datetime
from dateutil import tz

# First create the tzinfo object
tzlocal = tz.tzoffset('IST', 19800)

# Now add it to a naive datetime
local = naive.replace(tzinfo=tzlocal)

# Or convert another timezone to it
utcnow = datetime.utcnow().replace(tzinfo=tz.tzutc())
now = utcnow.astimezone(tzlocal)

j'ai cherché le nom ISTde là. Le le nom peut vraiment être n'importe quoi. Faites juste attention si vous déviez, car si vous utilisez du code qui dépend du nom, il pourrait conduire à des bugs plus tard.

soit dit en passant, si vous avez le nom du fuseau horaire au départ, et que votre système d'exploitation le supporte, vous pouvez utiliser gettz au lieu de:

# Replace the above with this
tzlocal = tz.gettz('IST')
20
répondu Joe 2015-02-02 22:10:23

Python Standard Library (8.1.6) dit que:

  • tzinfo est une classe de base abstraite
  • le module datetime ne fournit pas de sous-classes concrètes de tzinfo
  • vous devez dériver une sous-classe concrète, et (au moins) fournir des implémentations des méthodes tzinfo standard nécessaires aux méthodes datetime que vous utilisez
  • une sous-classe concrète de tzinfo peut avoir besoin de mettre en œuvre les éléments suivants: méthode. .. En cas de doute, il suffit de les mettre en œuvre toutes
    • tzinfo.utcoffset ( self, dt): décalage de l'heure locale par rapport à UTC, en minutes à l'est de UTC
    • tzinfo.dst (self, dt) : renvoie le réglage de l'heure avancée( DST), en minutes à l'est de UTC, ou Aucun si les informations de DST ne sont pas connues
    • tzinfo.tzname ( self, dt): renvoie le nom du fuseau horaire correspondant à l'objet datetime dt, sous forme de chaîne

tout cela signifie que vous devrez fournir votre propre implémentation pour le tzinfo. Par exemple :

class UTC0530(datetime.tzinfo):
    """tzinfo derived concrete class named "+0530" with offset of 19800"""
    # can be configured here
    _offset = datetime.timedelta(seconds = 19800)
    _dst = datetime.timedelta(0)
    _name = "+0530"
    def utcoffset(self, dt):
        return self.__class__._offset
    def dst(self, dt):
        return self.__class__._dst
    def tzname(self, dt):
        return self.__class__._name

Utilisation :

tz = UTC0530()
d = datetime.datetime.now(tz)
d.isoformat()

sortie :

2015-01-27T20:19:41.257000+05:30
14
répondu Serge Ballesta 2015-01-27 14:58:29

vous devez mettre en œuvre la sous-classe de datetime.tzinfo classe. Le guide général est décrit ici, où vous pouvez également trouver d'excellents exemples d'implémentations tzinfo personnalisées.

from datetime import tzinfo, timedelta, datetime
from pytz import UTC


class MyUTCOffsetTimezone (tzinfo):

    def __init__(self, offset=19800, name=None):
        self.offset = timedelta(seconds=offset)
        self.name = name or self.__class__.__name__

    def utcoffset(self, dt):
        return self.offset

    def tzname(self, dt):
        return self.name

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


now = datetime.now(tz=UTC)
print now
# -> 2015-01-28 10:46:42.256841+00:00
print now.astimezone(MyUTCOffsetTimezone())
# -> 2015-01-28 16:16:42.256841+05:30
print datetime.now(MyUTCOffsetTimezone())
# -> 2015-01-28 16:16:42.256915+05:30
7
répondu Dmitry Nedbaylo 2015-01-28 10:48:01

Si vous avez pytz:

tz = pytz.FixedOffset(180)
now = timezone.now()
local_now = tz.normalize(now.astimezone(tz))
6
répondu kubilayeksioglu 2015-09-11 07:03:17

avec Python 3.2 ou plus, vous pouvez le faire en utilisant la bibliothèque DateTime intégrée:

import datetime
datetime.timezone(-datetime.timedelta(hours=5, minutes=30)
sign, hours, minutes = re.match('([+\-]?)(\d{2})(\d{2})', '+0530').groups()
sign = -1 if sign == '-' else 1
hours, minutes = int(hours), int(minute)

tzinfo = datetime.timezone(sign * datetime.timedelta(hours=hours, minutes=minutes))
datetime.datetime(2013, 2, 3, 9, 45, tzinfo=tzinfo)
4
répondu Turtles Are Cute 2018-03-20 22:49:26