Search code examples
pythondatetimepython-dateutilpython-datetime

Get tz offset from string


I have a date which is in local time:

date: "2013-12-02 22:00:00"

and another value the tz:

timezone_offset: "GMT-0800"

If I : dateutil.parser.parse(date).isoformat() I will get:

"2013-12-02T22:00:00+0000"

I want to implement the date in ISO format with the tz info and get a result of:

"2013-12-02T22:00:00-0800"

Something close to: parse(date,tzinfos=??).isoformat() ? How can I get the tzinfo from the string timezone_offset ?


Solution

  • >>> from dateutil.parser import parse
    >>> dt = parse("2013-12-02 22:00:00" + "GMT+0800")
    >>> dt.isoformat()
    '2013-12-02T22:00:00-08:00'
    

    Note: the sign is reversed.

    You could also do it using only stdlib:

    >>> from datetime import datetime
    >>> dt = datetime.strptime("2013-12-02 22:00:00", "%Y-%m-%d %H:%M:%S")
    >>> dt = dt.replace(tzinfo=FixedOffset(-8*60, "GMT+0800"))
    >>> dt.isoformat()
    '2013-12-02T22:00:00-08:00'
    

    where FixedOffset is taken from datetime docs:

    from datetime import tzinfo, timedelta
    
    class FixedOffset(tzinfo):
        """Fixed offset in minutes east from UTC."""
    
        def __init__(self, offset, name):
            self.__offset = timedelta(minutes = offset)
            self.__name = name
    
        def utcoffset(self, dt):
            return self.__offset
    
        def tzname(self, dt):
            return self.__name
    
        def dst(self, dt):
            return timedelta(0)
    

    Here's the same using pytz module:

    >>> from datetime import datetime
    >>> import pytz
    >>> dt = datetime.strptime("2013-12-02 22:00:00", "%Y-%m-%d %H:%M:%S")
    >>> dt = pytz.timezone('Etc/GMT+8').localize(dt)
    >>> dt.isoformat()
    '2013-12-02T22:00:00-08:00'