100

I have a date time string that I don't know how to parse it in Python.

The string is like this:

Tue May 08 15:14:45 +0800 2012 

I tried

datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y") 

but Python raises

'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y' 

According to Python doc:

%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive).

What is the right format to parse this time string?

1

5 Answers 5

135

datetime.datetime.strptime has problems with timezone parsing. Have a look at the dateutil package:

>>> from dateutil import parser >>> parser.parse("Tue May 08 15:14:45 +0800 2012") datetime.datetime(2012, 5, 8, 15, 14, 45, tzinfo=tzoffset(None, 28800)) 
Sign up to request clarification or add additional context in comments.

11 Comments

@zidarsk8 try this: parser.parse("02/Nov/2012:06:37:42 +0000",fuzzy=True) - specifying fuzzy, the parser ignores characters it doesn't understand.
This actually parses the date incorrectly. Fri Nov 9 09:04:02 2012 -0500 ignores -0500 and uses the current time zone.
The command is "pip install python-dateutil" to install it using pip btw.
Be careful - using this library I also got incorrect results, the month and the day flipped! 19.01.2017 => January, 12.01.2017=>December
@eumiro I just proposed an edit to your answer, but my edit is wrong, and I can't figure out how to cancel the edit. Please reject it.
|
43

Your best bet is to have a look at strptime()

Something along the lines of

>>> from datetime import datetime >>> date_str = 'Tue May 08 15:14:45 +0800 2012' >>> date = datetime.strptime(date_str, '%a %B %d %H:%M:%S +0800 %Y') >>> date datetime.datetime(2012, 5, 8, 15, 14, 45) 

Im not sure how to do the +0800 timezone unfortunately, maybe someone else can help out with that.

The formatting strings can be found at http://docs.python.org/library/time.html#time.strftime and are the same for formatting the string for printing.

Hope that helps

Mark

PS, Your best bet for timezones in installing pytz from pypi. ( http://pytz.sourceforge.net/ ) in fact I think pytz has a great datetime parsing method if i remember correctly. The standard lib is a little thin on the ground with timezone functionality.

1 Comment

eumiro mentions datetime.datetime.strptime has problems with timezone parsing. I thinks it is true
7

Here's a stdlib solution that supports a variable utc offset in the input time string:

>>> from email.utils import parsedate_tz, mktime_tz >>> from datetime import datetime, timedelta >>> timestamp = mktime_tz(parsedate_tz('Tue May 08 15:14:45 +0800 2012')) >>> utc_time = datetime(1970, 1, 1) + timedelta(seconds=timestamp) >>> utc_time datetime.datetime(2012, 5, 8, 7, 14, 45) 

2 Comments

This is solid! My string had "GMT-0500" for example and parsedate_tz seems to get confused with the "GMT" but a quick .replace("GMT", "") and it's perfect!
There is a function in email.utils called parsedate_to_datetime() that makes convertion to datetime.datetime for you
3

It has discussed many times in SO. In short, "%z" is not supported because platform not support it. My solution is a new one, just skip the time zone.:

 datetime.datetime.strptime(re.sub(r"[+-]([0-9])+", "", "Tue May 08 15:14:45 +0800 2012"),"%a %b %d %H:%M:%S %Y") 

1 Comment

Your solution still breaks, it just doesn't throw an error.
0
In [117]: datetime.datetime.strptime? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in method strptime of type object at 0x9a2520> Namespace: Interactive Docstring: string, format -> new datetime parsed from a string (like time.strptime()). 

1 Comment

I tried datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y"), but Python raises 'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y'

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.