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.
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 IST
de 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')
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
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
Si vous avez pytz:
tz = pytz.FixedOffset(180)
now = timezone.now()
local_now = tz.normalize(now.astimezone(tz))
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)