[Tutor] datetime, time zones, and ISO time

Kent Johnson kent37 at tds.net
Wed Feb 17 22:12:01 CET 2010


On Wed, Feb 17, 2010 at 3:48 PM, David Perlman <dperlman at wisc.edu> wrote:
> Surely there is a way to simply print out the local time, date and time zone
> without needing to write your own class...  I can't believe this is the only
> way...
>
> Here's why I don't believe it.  Both the datetime and time modules provide
> both functions for returning the current local time, and the current utc
> time.  So, assuming that those functions are trustworthy, it *must* be true
> that the OS always knows the current offset from utc time.  So why is there
> no straightforward way to get that offset in python?  I mean, I can do this:

time.timezone gives the offset for standard time.

Kent

>
>>>> datetime.datetime.now()-datetime.datetime.utcnow()
> datetime.timedelta(-1, 64799, 999987)
>
> But then, of course, it's off by a few fractions of a microsecond.  This
> works:
>
>>>> time.localtime()[3]-time.gmtime()[3]
> -6
>
> But doesn't that seem like a ridiculous hack, well outside of the spirit of
> the zen of python?  Shouldn't there be one obvious right way to do this?
>
> Yes, I know that as William sent, the documentation points out that the
> rules the world over are complicated and irrational.  Nonetheless, it is
> implicit in the existing definitions that the system *knows* the current
> offset, even if it doesn't know the whole set of rules...
>
>
> On Feb 17, 2010, at 2:26 PM, Kent Johnson wrote:
>
>> On Wed, Feb 17, 2010 at 3:12 PM, David Perlman <dperlman at wisc.edu> wrote:
>>>
>>> Yeah, I got this part.  The thing that's hanging me up is that there
>>> doesn't
>>> seem to be any way to get a tzinfo instance that contains the current
>>> local
>>> time zone information.  You can do time.timezone to get the seconds from
>>> UTC, but there doesn't seem to be any way to convert that into a tzinfo!
>>>  I
>>> would be perfectly satisfied with this:
>>>
>>> tz=offset_to_tzinfo(time.timezone) # or whatever
>>> aware_now=datetime.datetime.now(tz)
>>> print aware_now.isoformat()
>>>
>>> I'm pretty sure that would give me what I want, but there doesn't seem to
>>> be
>>> any way to do step one without subclassing tzinfo.  This makes me feel
>>> like
>>> I MUST be missing something obvious, because it shouldn't require so much
>>> coding just to find out what the current local time and timezone is!
>>
>> The docs make it clear that you do have to subclass tzinfo, that no
>> implementations are provided.
>> It sounds like you want the LocalTimezone class in the examples at the
>> bottom of this section - "A class capturing the platform's idea of
>> local time":
>> http://docs.python.org/library/datetime.html#tzinfo-objects
>>
>> Kent
>
> --
> -dave----------------------------------------------------------------
> "Pseudo-colored pictures of a person's brain lighting up are
> undoubtedly more persuasive than a pattern of squiggles produced by a
> polygraph.  That could be a big problem if the goal is to get to the
> truth."  -Dr. Steven Hyman, Harvard
>
>
>
>


More information about the Tutor mailing list