Become a Patron!

My Amazon wishlist can be found here.

Life Line

Parsing dates

For some reason I started maintaining PHP's strtotime() function, which parses a strings containing a date/time representation, such as "2004-04-18 17:59 CEST", "April 18, 2004" and the like. With so many different formats one guy in the past crafted a parser for this basing the syntax on GNU tar . The original function had some problems, or was missing some formats (such as the highly useful ISO 8601 formats) and during time this original parser was extended. it might have been a nice and simple bison parser, with a hand craften lexer, but I can assure you that it is now shitty, buggy and totaly unmaintainable. Nobody knows what formats it's supposed to parse either.

With those four problems in my head I decided to redo this shitty old and messy parser by using re2c to do the parsing. Their is a problem though as I don't know which format it's supposed to parse at all (except the GNU tar things and ISO 8601 stuff) so I'm asking you guys which formats it should be able to parse, and which formats you already parse with the strtotime() function.

Shortlink

This article has a short URL available: https://drck.me/parsing-dates-37r

Comments

This one's odd because the time comes before the year, but it's the locale standard.

$ date +"%c" Sun Apr 18 18:36:57 2004

These are the only strtotime formats I already use:

strtotime ("+20 minutes") strtotime ("+3 month") strtotime ("Monday") strtotime ("2001-10-24 15:22:13")

I think it would be good to be able to parse the default timstamp and date formats for postgresql, mysql and probably oracle and mssql. I only use postgresql so I can only point you here:

http://www.postgresql.org/docs/7.4/static/datatype-datetime.html

Parsing anything that a database could spit out would be great...

culley

Like culley's suggestion regarding database date formats, consider also typical

webserver log date formats. For example, for Apache's logs: http://httpd.apache.org/docs/logs.html http://httpd.apache.org/docs-2.0/logs.html

Also, how about operating system timestamps: http://weblogs.asp.net/oldnewthing/archive/2003/09/05/54806.aspx

There may be some good clues in the GNU C Library: http://www.gnu.org/software/libc/manual/html_node/Calendar-Time.html#Calendar%20Time

Maybe some clues here in POSIX Locale: http://www.opengroup.org/onlinepubs/007908799/xbd/locale.html#tag_005_003_005

Here are some additional database date and time function format references: http://dev.mysql.com/doc/mysql/en/Date_and_time_functions.html http://otn.oracle.com/tech/blaf/specs/commonFormats.html http://www.sswug.org/searchresults.asp?keywordstofind2=date%20time

For me, the most useful things about strftime() are doing relative date math ("+2 days") ("1 sunday ago") that properly accounts for DST switches and stuff based on days of the week ("next Monday").

Add Comment

Name:
Email:

Will not be posted. Please leave empty instead of filling in garbage though!
Comment:

Please follow the reStructured Text format. Do not use the comment form to report issues in software, use the relevant issue tracker. I will not answer them here.


All comments are moderated