By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,767 Members | 1,995 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,767 IT Pros & Developers. It's quick & easy.

time.strptime() for different languages

P: n/a
Anyone know of something that works like time.strptime(), but for
other languages? Specifically, Dutch (ex: "31 augustus 2005, 17:26")
and German?

Thinking out loud... since "31 augustus 2005, 17:26" is only different
by month name, I suppose I could just substitute the month name using
a translation table for English to Dutch month names.

--
Adam Monsen
http://adammonsen.com/

(crossposted to Seattle Python Users List)

Aug 31 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a
Adam Monsen wrote:
Anyone know of something that works like time.strptime(), but for
other languages? Specifically, Dutch (ex: "31 augustus 2005, 17:26")
and German?

Thinking out loud... since "31 augustus 2005, 17:26" is only different
by month name, I suppose I could just substitute the month name using
a translation table for English to Dutch month names.


Have you tested it with the proper locale setting and strptime(dateString,
"%c")? I have not ;)

--
Benjamin Niemann
Email: pink at odahoda dot de
WWW: http://www.odahoda.de/
Aug 31 '05 #2

P: n/a
No, this doesn't seem to work, and I can't find anything in the
documentation indicating that it should.
import os
os.getenv('LANG') 'nl_NL' import time
time.strptime("10 augustus 2005 om 17:26", "%d %B %Y om %H:%M")

Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/_strptime.py", line 292, in strptime
raise ValueError("time data did not match format: data=%s fmt=%s"
%
ValueError: time data did not match format: data=10 augustus 2005 om
17:26 fmt=%d %B %Y om %H:%M

--
Adam Monsen
http://adammonsen.com/

Aug 31 '05 #3

P: n/a
Adam Monsen wrote:
No, this doesn't seem to work, and I can't find anything in the
documentation indicating that it should.
import os
os.getenv('LANG') 'nl_NL' import time
time.strptime("10 augustus 2005 om 17:26", "%d %B %Y om %H:%M") Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/_strptime.py", line 292, in strptime
raise ValueError("time data did not match format: data=%s fmt=%s"
%
ValueError: time data did not match format: data=10 augustus 2005 om
17:26 fmt=%d %B %Y om %H:%M

import locale, time
time.strftime("%B") 'August' locale.getlocale() (None, None) locale.setlocale(locale.LC_ALL, "") 'nl_NL' locale.getlocale() ('nl_NL', 'ISO8859-1') time.strftime("%B") 'augustus' time.strptime("10 augustus 2005 om 17:26", "%d %B %Y om %H:%M")

(2005, 8, 10, 17, 26, 0, 2, 222, -1)

(see http://docs.python.org/lib/module-locale.html for more on this)

</F>

Aug 31 '05 #4

P: n/a
Excellent! Thank you, Fredrik!

--
Adam Monsen
http://adammonsen.com/

Sep 1 '05 #5

P: n/a
Strange, but I can't figure out how to switch back to the default
locale.
import locale, datetime, time
locale.setlocale(locale.LC_ALL, 'nl_NL') 'nl_NL' date = '10 augustus 2005 om 17:26'
time.strptime(date, "%d %B %Y om %H:%M") (2005, 8, 10, 17, 26, 0, 2, 222, -1) locale.setlocale(locale.LC_ALL, '') 'en_US.UTF-8' date = '10 August 2005 at 17:26'
time.strptime(date, "%d %B %Y at %H:%M")

Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/_strptime.py", line 292, in strptime
raise ValueError("time data did not match format: data=%s fmt=%s"
%
ValueError: time data did not match format: data=10 August 2005 at
17:26 fmt=%d %B %Y at %H:%M
Also, locale.resetlocale() throws locale.Error (I saw some open bugs on
this).

Ugh! Is this stuff broken or is it just me?

--
Adam Monsen
http://adammonsen.com/

Sep 1 '05 #6

P: n/a
Figured this out. I thought I'd post my results in case it is helpful
to someone else.

----------------------------------8<----------------------------------
import locale, time
# save old locale
old_loc = locale.getlocale(locale.LC_TIME)
locale.setlocale(locale.LC_TIME, 'nl_NL')
# seems to be the only way to avoid a ValueError from _strptime...
# now that's a badly behaved module!
import _strptime; reload(_strptime)
# parse local date
date = '10 augustus 2005 om 17:26'
format = '%d %B %Y om %H:%M'
dateTuple = time.strptime(date, format)
# switch back to previous locale
locale.setlocale(locale.LC_TIME, old_loc)
---------------------------------->8----------------------------------

If I try to do further date parsing in the same scope (with a different
locale), it fails. Let me know if you have any ideas about why.

--
Adam Monsen
http://adammonsen.com/

Sep 1 '05 #7

P: n/a
One way I'm able to do further date parsing in other locales is to
switch the locale for LC_TIME, bust the _strptime regular expressions
manually, then call strptime() again. Here's a function to bust the
cache. This works for me, but your mileage may vary.

def bust_strptime_cache():
import _strptime
_strptime._cache_lock.acquire()
_strptime._TimeRE_cache = _strptime.TimeRE()
_strptime._regex_cache = {}
_strptime._cache_lock.release()

This has been filed as Python bug #1290505. (
http://sf.net/support/tracker.php?aid=1290505 ) A full test case is
attached to that bug.

--
Adam Monsen
http://adammonsen.com/

Sep 13 '05 #8

P: n/a
Brett Cannon fixed this bug last week. Thanks, Brett!

--
Adam Monsen
http://adammonsen.com/

Sep 19 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.