Converting from local -> UTC

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Tue Jul 15 00:04:21 EDT 2008


En Mon, 14 Jul 2008 12:06:30 -0300, Keith Hughitt  
<keith.hughitt at gmail.com> escribió:
> On Jul 12, 12:52 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
> wrote:
>> En Fri, 11 Jul 2008 15:42:37 -0300, Keith Hughitt  
>> <keith.hugh... at gmail.com> escribió:
>>
>> > I am having a little trouble figuring out how to convert a python
>> > datetime to UTC. I have a UTC date (e.g. 2008-07-11 00:00:00). I would
>> > like to create a UTC date so that when I send it to MySQL (which
>> > treats all dates at local dates by default), it will already have
>> > incorporated the proper UTC offset. I've tried looking through the
>> > docshttp://python.active-venture.com/lib/datetime-datetime.html), but
>> > have not had any luck.
>>
>> You have to use a "timezone aware" datetime object. If all you want is  
>> to  
>> store an UTC date, the tzinfo demo classes that you can find in the  
>> Python  
>> docs at <http://docs.python.org/lib/datetime-tzinfo.html> may be enough.
>
> Thanks for advice Gabriel. I downloaded the tzinfo demo class, saved
> it as
> UTC.py and imported it. I'm still not exactly sure how to use it
> though. It looks like
> the file already creates an instance of the UTC tzinfo class (line 20:
> "utc = UTC()"),
> however, when I try to test it out in the interpreter, it cannot be
> found. I'm new
> to python, and there is probably something obvious I'm missing, but do
> you have any ideas?

The import statement in Python doesn't behave the same way as similar  
statements in other languages - and it may be confusing you. I'll try to  
explain it using this example.
You have:
- a *file* UTC.py, containing the source code for the *module* UTC. It  
contains:
- a *class* definition (UTC) and
- an *instance* of that class, utc.

--- begin UTC.py ---
class UTC(tzinfo):
   ...
utc = UTC()
...
--- end UTC.py ---

> Here is what I'm attempting:
>
> ============ output begin =============
>
> Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42)
> [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> import datetime, UTC

Here you have imported the *module* UTC. That is, the name UTC now refers  
to a newly created module just loaded from the UTC.py file.

>>>> t = datetime.datetime(2008, 7, 14, 00, 00, 00, UTC())
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: 'module' object is not callable

The error comes from UTC(): UTC is a module, UTC() is attempting to "call"  
it, and since modules are not callable objects, we get a TypeError.

>>>> utc
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> NameError: name 'utc' is not defined

The *only* name we have imported so far is UTC - the module. Lowercase utc  
isn't defined.

>>>> utc = UTC()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: 'module' object is not callable

Same as above...

Ok, how to solve it? We know that UTC refers to the *module* with the same  
name. To get the *class* inside that module, use UTC.UTC - try again in  
the interpreter. To create a new instance of that class, you can use  
UTC.UTC(). To obtain the instance already created in the UTC module, use  
UTC.utc

**OR**

Import those names explicitely:

py> from UTC import UTC

In this case the name UTC refers to the *class* inside the module.
In this particular example it may be confusing - both have the same name.  
Another example from the standard library: the poplib module contains a  
POP3 class, so after executing this line:

py> from poplib import POP3

the name POP3 refers to that class. The poplib module itself isn't  
directly available.
Back to the UTC module, you could use:

py> from UTC import utc

and now utc refers to the *instance* already created inside the module.  
This last form may be the most convenient in your case:

py> import datetime
py> from UTC import utc
py> print datetime.datetime(2008, 7, 14, 20, 30, 0, 0, utc)
2008-07-14 20:30:00+00:00

-- 
Gabriel Genellina




More information about the Python-list mailing list