PHP Dates and Times
Parsing Dates and Times from Strings
Problem
You 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” or “February 9, 2004” into an epoch timestamp.Solution
The simplest way to parse a date or time string of arbitrary format is with strto time(), which turns a variety of human-readable date and time strings into epoch timestamps, as shown in example.Example Parsing strings with strtotime()
$a = strtotime('march 10'); // defaults to the current year
$b = strtotime('last thursday');
$c = strtotime('now + 3 months');
Discussion
The grammar strtotime() uses is both complicated and comprehensive. It incorporates the GNU Date Input Formats specification (which is available from GNU) and some extensions. The function strtotime() understands words about the current time:$a = strtotime('now');
print date(DATE_RFC850, $a);
print "\n";
$a = strtotime('today');
print date(DATE_RFC850, $a);
Tuesday, 12-Feb-13 19:12:14 UTC
Tuesday, 12-Feb-13 00:00:00 UTC
It understands different ways to identify a time and date:
$a = strtotime('5/12/2014');
print date(DATE_RFC850, $a);
print "\n";
$a = strtotime('12 may 2014');
print date(DATE_RFC850, $a);
Monday, 12-May-14 00:00:00 UTC
Monday, 12-May-14 00:00:00 UTC
It understands relative times and dates:
$a = strtotime('last thursday'); // On February 12, 2013
print date(DATE_RFC850, $a);
print "\n";
$a = strtotime('2015-07-12 2pm + 1 month');
print date(DATE_RFC850, $a);
Thursday, 07-Feb-13 00:00:00 UTC
Wednesday, 12-Aug-15 14:00:00 UTC
It understands time zones. In the following code, the time part (2pm) doesn’t change because both PHP’s default time zone identifier (America/New_York) and the time zone in the string passed to strtotime() are the same (EDT is the time zone abbreviation for daylight saving time in New York):
date_default_timezone_set('America/New_York');
$a = strtotime('2012-07-12 2pm America/New_York + 1 month');
print date(DATE_RFC850, $a);
Sunday, 12-Aug-12 14:00:00 EDT
However, with PHP’s default time zone identifier set to America/Denver (two hours before America/New_York), the same string passed to strtotime() produces the time in New York when it is 2 P.M. in Denver (two hours before New York):
date_default_timezone_set('America/New_York');
$a = strtotime('2012-07-12 2pm America/Denver + 1 month');
print date(DATE_RFC850, $a);
Sunday, 12-Aug-12 16:00:00 EDT
The same extensive grammar that strtotime() uses is also applied when creating a DateTime object. So, although strtotime() is very useful if you just need an epoch timestamp, you can pass the same strings to new DateTime() to build a DateTime object for further manipulation.
If you find yourself with a date or time string with a known format, but that is not parseable by strtotime(), you can still create DateTime objects based on the string by using DateTime::createFromFormat(). Example shows how to use Date Time::createFromFormat() to parse date strings written in day-month-year order. (PHP’s default is month-day-year order.)
Example Parsing a date with a specific format
$dates = array('01/02/2015', '03/06/2015', '09/08/2015');
foreach ($dates as $date) {
$default = new DateTime($date);
$day_first = DateTime::createFromFormat('d/m/Y|', $date);
printf("The default interpretation is %s\n but day-first is %s.\n",
$default->format(DateTime::RFC850),
$day_first->format(DateTime::RFC850));
}
Example prints:
The default interpretation is Friday, 02-Jan-15 00:00:00 UTC
but day-first is Sunday, 01-Feb-15 00:00:00 UTC.
The default interpretation is Friday, 06-Mar-15 00:00:00 UTC
but day-first is Wednesday, 03-Jun-15 00:00:00 UTC.
The default interpretation is Tuesday, 08-Sep-15 00:00:00 UTC
but day-first is Sunday, 09-Aug-15 00:00:00 UTC.
No comments:
Post a Comment