Converting from local -> UTC

Keith Hughitt keith.hughitt at gmail.com
Wed Jul 16 20:00:50 CEST 2008


Thanks Gabriel!

That helps clear things up for me. The above method works very well. I
only have one remaining question:
How can I pass a datetime object to MySQL?'

So far, what I've been doing is building the query as a string, for
example:

query = "INSERT INTO image VALUES(%d, %d, %s, '%s')" % (id, meas,
date, 'jpg')
cursor.execute(query)

This works fine for regular datetime objects, which are passed as
strings similar
to: "2003-10-01 00:00:00." When incorporating a timezone, however, the
resulting string
is of the form "2003-10-01 00:00:00+00:00." Unfortunately, MySQL does
not recognize
the offset.

I know you said you don't use MySQL, but how would you do something
execute a similar query
on the database you normally interface with?


Thanks,
Keith


On Jul 15, 12:04 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Mon, 14 Jul 2008 12:06:30 -0300,KeithHughitt  
> <keith.hugh... 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,KeithHughitt  
> >> <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 ---If you pass a "timezone aware" datetime object as a SQL parameter
> 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