6

I have a date that is either in German for e.g,

2. Okt. 2009

and also perhaps as

2. Oct. 2009

How do I convert this into an ISO datetime (or Python datetime)?

Solved by using this snippet:

for l in locale.locale_alias:
    worked = False
    try:
        locale.setlocale(locale.LC_TIME, l)
        worked = True
    except:
        worked = False
    if worked: print l

And then plugging in the appropriate for the parameter l in setlocale.

Can parse using

import datetime
print datetime.datetime.strptime("09. Okt. 2009", "%d. %b. %Y")
FObersteiner
  • 22,500
  • 8
  • 42
  • 72
geejay
  • 5,440
  • 8
  • 50
  • 60

2 Answers2

11

http://docs.python.org/library/locale.html

The datetime module is already locale-aware.

It's something like the following

# German locale
loc = locale.setlocale(locale.LC_TIME, ("de","de"))
try:
     date = datetime.date.strptime(input, "%d. %b. %Y")
except:
     # English locale
     loc = locale.setlocale(locale.LC_TIME, ("en","us"))
     date = datetime.date.strptime(input, "%d. %b. %Y")
        
FObersteiner
  • 22,500
  • 8
  • 42
  • 72
S.Lott
  • 384,516
  • 81
  • 508
  • 779
  • thanks. I had to search for supported locales on my machine (see edit) to find the appropriate German locale identifier. – geejay Aug 19 '09 at 12:45
  • 3
    `type object 'datetime.date' has no attribute 'strptime'` (neither in 2.7 nor in 3.5). Use `datetime.strptime()` instead. – flaschbier May 28 '16 at 09:38
3

Very minor point about your code snippet: I'm no Python expert but I'd consider the whole "flag to check for success + silently swallowing all exceptions" to be bad style.

try/expect/else does what you want in a cleaner way, I think:

for l in locale.locale_alias:
    try:
        locale.setlocale(locale.LC_TIME, l)
    except locale.Error: # the doc says setlocale should throw this on failure
        pass
    else:
        print l
FObersteiner
  • 22,500
  • 8
  • 42
  • 72
Nicolas Lefebvre
  • 4,247
  • 1
  • 25
  • 29