3.10. Parsing Dates and Times from Strings3.10.1. ProblemYou need to get a date or time in a string into a format you can use in calculations. For example, you want to convert date expressions such as "last Thursday" into an epoch timestamp. 3.10.2. SolutionThe simplest way to parse a date or time string is with strtotime( ) , which turns a variety of human-readable date and time strings into epoch timestamps: $a = strtotime('march 10'); // defaults to the current year 3.10.3. DiscussionThe grammar strtotime( ) uses is both complicated and comprehensive so the best way to get comfortable with it is to try out lots of different time expressions. If you're curious about its nuts and bolts, check out ext/standard/parsedate.y in the PHP source distribution. The function strtotime( ) understands words about the current time: $a = strtotime('now'); print strftime('%c',$a); $a = strtotime('today'); print strftime('%c',$a); Mon Aug 12 20:35:10 2002 Mon Aug 12 20:35:10 2002 It understands different ways to identify a time and date: $a = strtotime('5/12/1994'); print strftime('%c',$a); $a = strtotime('12 may 1994'); print strftime('%c',$a); Thu May 12 00:00:00 1994 Thu May 12 00:00:00 1994 It understands relative times and dates: $a = strtotime('last thursday'); // On August 12, 2002 print strftime('%c',$a); $a = strtotime('2001-07-12 2pm + 1 month'); print strftime('%c',$a); Thu Aug 8 00:00:00 2002 Mon Aug 12 14:00:00 2002 It understands time zones. When the following is run from a computer in EDT, it prints out the same time: $a = strtotime('2002-07-12 2pm edt + 1 month'); print strftime('%c',$a); Mon Aug 12 14:00:00 2002 However, when the following is run from a computer in EDT, it prints out the time in EDT when it is 2 P.M. in MDT (two hours before EDT): $a = strtotime('2002-07-12 2pm mdt + 1 month'); print strftime('%c',$a); Mon Aug 12 16:00:00 2002 If the date and time you want to parse out of a string are in a format you know in advance, instead of calling strtotime( ), you can build a regular expression that grabs the different date and time parts you need. For example, here's how to parse "YYYY-MM-DD HH:MM:SS" dates, such as a MySQL DATETIME field: $date = '1974-12-03 05:12:56'; preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date,$date_parts); This puts the year, month, day, hour, minute, and second into $date_parts[1] through $date_parts[6]. (preg_match( ) puts the entire matched expression into $date_parts[0].) You can use regular expressions to pull the date and time out of a larger string that might also contain other information (from user input, or a file you're reading), but if you're sure about the position of the date in the string you're parsing, you can use substr( ) to make it even faster: $date_parts[0] = substr($date,0,4); $date_parts[1] = substr($date,5,2); $date_parts[2] = substr($date,8,2); $date_parts[3] = substr($date,11,2); $date_parts[4] = substr($date,14,2); $date_parts[5] = substr($date,17,2); You can also use split( ); $ar = split('[- :]',$date); print_r($ar); Array ( [0] => 1974 [1] => 12 [2] => 03 [3] => 05 [4] => 12 [5] => 56 ) Be careful: PHP converts between numbers and strings without any prompting, but numbers beginning with a 0 are considered to be in octal (base 8). So, 03 and 05 are 3 and 5; but, 08 and 09 are not 8 and 9. preg_match( ) and strtotime( ) are equally efficient in parsing a date format such as "YYYY-MM-DD HH:MM:SS", but ereg( ) is about four times slower than either. If you need the individual parts of the date string, preg_match( ) is more convenient, but strtotime( ) is obviously much more flexible. 3.10.4. See AlsoDocumentation on strtotime( ) at http://www.php.net/strtotime; the grammar for strtotime( ) is available at http://cvs.php.net/cvs.php/php4/ext/standard/parsedate.y. Copyright © 2003 O'Reilly & Associates. All rights reserved. |
|