ISO with timezone

Nicholas F. Fabry nick.fabry at coredump.us
Tue Jan 29 23:50:18 EST 2008


On Jan 29, 2008, at 13:56, nik wrote:

> Thanks,
> that does help and now I have:
>
>>>> from datetime import datetime, tzinfo, timedelta
>>>> import time
>>>> class TZ(tzinfo):
> ...    def utcoffset(self,dt): return timedelta(seconds=time.timezone)
> ...
>>>> print datetime(2008,2,29,15,30,11,tzinfo=TZ()).isoformat()
> 2008-02-29T15:30:11+8:00
>
>
> But what I want to know now it how to get the actual time into the
> expression instead of typing the 2008,2,29,15....
> So something like: >>> print
> datetime(time.gmtime(),tzinfo=TZ()).isoformat(), but that doesn't
> work.
>
> I realize that I could do:
>>>> t = time.gmtime()
>>>> print  
>>>> datetime(t[0],t[1],t[2],t[3],t[4],t[5],tzinfo=TZ()).isoformat()
>
> but I imagine there might be a cleaner way of doing this.
>
> Thanks,
> Nik
>

No need for the ugliness!  The constructor for class datetime has a  
method, .now() that returns the current date and time, as a naive  
datetime object (i.e. no tzinfo attached).  Since you want an aware  
datetime object (one with a tzinfo object attached), you can do it  
simply by feeding .now the tzinfo object you want attached, as below:

 >>> print datetime.now(TZ()).isoformat('T')
2008-01-29T23:43:16.809049-05:00

See PSL, Sect. 5.1.4

Dates and Times are a bit ugly in Python.  Don't be discouraged, but  
you do need to understand them quite well to get bug-free code that  
plays with them.

Nick Fabry




>
> On Jan 28, 9:10 pm, "Nicholas F. Fabry" <nick.fa... at coredump.us>
> wrote:
>> Hello, nik.
>>
>> On Jan 28, 2008, at 21:03, nik wrote:
>>
>>
>>
>>> Hi,
>>
>>> How does one express the time in ISO format with the timezone
>>> designator?
>>
>>> what I want is YYYY-MM-DDThh:mm:ss.sTZD
>>
>>>> From the documentation I see:
>>>>>> from datetime import tzinfo, timedelta, datetime
>>>>>> class TZ(tzinfo):
>>> ...     def utcoffset(self, dt): return timedelta(minutes=-399)
>>> ...
>>>>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
>>> '2002-12-25 00:00:00-06:39'
>>
>>> and I've also figured out:
>>>>>> datetime.datetime.fromtimestamp(time.time()).isoformat()[:-3]
>>> '2008-01-23T11:22:54.130'
>>
>>> But can't figure out how to fit them together.
>>
>> There is nothing there to 'fit together' - in the first example  
>> given,
>> the datetime object has no time component specified, so it fills in
>> default vaules of zero.  The following should make this clear:
>>
>>>>> your_time = datetime(2008, 2, 29, 15, 30, 11, tzinfo=TZ())
>>>>> print your_time
>> 2008-02-29 15:30:11-05:00
>>>>> print your_time.isoformat('T')
>> 2008-02-29T15:30:11-05:00
>>
>> If you wish to append the NAME of the tzinfo object instead of its
>> offset, that requires a bit more playing around (along with a  
>> properly
>> defined tzinfo object - check out dateutil or pytz for a concrete
>> implementation of tzinfo subclasses (i.e. timezones)), but the
>> following would work:
>>
>>>>> print your_time.strftime('%Y-%m-%dT%H:%M:%S %Z')
>> 2008-02-29T15:30:11 EST
>>
>> For details on how the .strftime method works, see Python Standard
>> Library, Section 14.2.
>>
>> I hope this helps!
>>
>> Nick Fabry
>>
>>> Thank you,
>>> Nik
>>> --
>>> http://mail.python.org/mailman/listinfo/python-list
>
>>
> -- 
> http://mail.python.org/mailman/listinfo/python-list




More information about the Python-list mailing list