date_parse
(PHP 5 >= 5.2.0)
date_parse — Returns associative array with detailed info about given date
Description
array date_parse
( string
$date
)Return Values
Returns array with information about the parsed date
on success or FALSE
on failure.
Errors/Exceptions
In case the date format has an error, the element 'errors' will contains the error messages.
Examples
Example #1 A date_parse() example
<?php
print_r(date_parse("2006-12-12 10:00:00.5"));
?>
The above example will output:
Array ( [year] => 2006 [month] => 12 [day] => 12 [hour] => 10 [minute] => 0 [second] => 0 [fraction] => 0.5 [warning_count] => 0 [warnings] => Array() [error_count] => 0 [errors] => Array() [is_localtime] => )
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с датой и временем
- Дата и Время
- checkdate
- date_add
- date_create_from_format
- date_create_immutable_from_format
- date_create_immutable
- date_create
- date_date_set
- date_default_timezone_get
- date_default_timezone_set
- date_diff
- date_format
- date_get_last_errors
- date_interval_create_from_date_string
- date_interval_format
- date_isodate_set
- date_modify
- date_offset_get
- date_parse_from_format
- date_parse
- date_sub
- date_sun_info
- date_sunrise
- date_sunset
- date_time_set
- date_timestamp_get
- date_timestamp_set
- date_timezone_get
- date_timezone_set
- date
- getdate
- gettimeofday
- gmdate
- gmmktime
- gmstrftime
- idate
- localtime
- microtime
- mktime
- strftime
- strptime
- strtotime
- time
- timezone_abbreviations_list
- timezone_identifiers_list
- timezone_location_get
- timezone_name_from_abbr
- timezone_name_get
- timezone_offset_get
- timezone_open
- timezone_transitions_get
- timezone_version_get
Коментарии
Careful - date_parse is perfectly happy with something like this:
date_parse("2006-2-31");
Caution: date_parse expects months 1..12 only.
date_parse("13/1/5769") for month=13, Ehul in Jewish calendar, results in month==3 instead of month==13.
It does, however, report the error array showing "Unexpected Character."
It would be nice if date_parse could handle the months properly (just report back a "13" for the month). The older approach of substr() is my workaround.
<?php
$ida = '091122671325';
$idb = '091123671325';
// This function will match the identity number up to the day, but only for a maximum of 99years+364days.
// Will not work when checking persons older than 100years-1day.
function idtodate($id)
{
$year = date("Y");
$month = date("m");
$day = date("d");
$nc = substr($year, 0, 2);
$ny = substr($year, 2, 2);
$y = substr($id, 0, 2);
$m = substr($id, 2, 2);
$d = substr($id, 4, 2);
if($y.$m.$d <= $ny.$month.$day-1) {
$newc = $nc;
} else {
$newc = $nc-1;
}
$new = $newc.$y;
return array('year' => $new, 'month' => $m, 'day' => $d);
}
echo 'ID: '.$ida.'<br>';
print_r(idtodate($ida));
echo '<br><br>';
echo 'ID: '.$idb.'<br>';
print_r(idtodate($idb));
?>
Output:
1. If the year-month-day is smaller than today (2009-11-23), but bigger than 1999: year => 2009
ID: 091122671325
Array ( [year] => 2009 [month] => 11 [day] => 22 )
2. If the year-month-day is the same as, or bigger than today, but smaller than 2000: year => 1909
ID: 091123671325
Array ( [year] => 1909 [month] => 11 [day] => 23 )
A warning to others. Some keys will return with a default value where others will return as false if the date string has it omitted. Unsure if this is a bug or feature, but hopefully this will save someone some time.
<?php
///Example
$input = "Feb 2010";
$info = date_parse($input);
var_dump($info);
/*Returns:
array(12) {
["year"]=> int(2010)
["month"]=> int(2)
["day"]=> int(1) //<---expected false like below
["hour"]=> bool(false)
["minute"]=> bool(false)
["second"]=> bool(false)
["fraction"]=> bool(false)
["warning_count"]=> int(0)
["warnings"]=> array(0) { }
["error_count"]=> int(0)
["errors"]=> array(0) { }
["is_localtime"]=> bool(false)
}*/
?>
Be aware that date_parse() is happy with just a time zone and it can be pretty counter-intuitive. E.g.:
<?php
var_dump( date_parse('Europe/Madrid') );
?>
... prints an array where year, month, day... are FALSE. But so do these:
<?php
var_dump( date_parse('A') );
var_dump( date_parse('B') );
var_dump( date_parse('X') );
?>
Don't forget to further validate date_parse()'s output even when it isn't FALSE and the 'errors' key is empty.
See checkdate() at function.checkdate for Gregorian date validation.
A warning to some
<?php
$time = "00:14:38"
$parse_date = date_parse($time);
echo var_dump($parse_date) ."<br>";
//here you will get what you expect
$time = "-00:14:38"
$parse_date = date_parse($time);
echo var_dump($parse_date) ."<br>";
//here you will recieve hours minutes and seconds as booleans and as false and you will get error set to "Unexpected character"
$time = "00:-14:38"
$parse_date = date_parse($time);
echo var_dump($parse_date) ."<br>";
//here you will recieve the same as the above
$time = "00:14:-38"
$parse_date = date_parse($time);
echo var_dump($parse_date) ."<br>";
//here you will receive hours as 00 minutes as 14 and seconds as 0. The error will get set as the same as above. Meaning "Unexpected character"
?>
Here is a workaround for the "Feb 2010" problem. It also handles "2014".
http://stackoverflow.com/questions/27052374/php-date-parsefeb-2010-gives-day-1/27068409
It's sometimes useful to be able to store incomplete dates, for example when all you know of someone's birthdate is the year or the month and day.
date_parse() handles (and MySQL accepts) dates containing zero-value elements such as "2017-00-00" and "0000-03-29", leaving it up to the parent application to determine when to require and how to handle missing date elements. date_parse() correctly reports zero values for zero-value date elements, reports an 'invalid date' warning, and does not report an error.
Example 1: Year only
<?php print_r( date_parse( '2017-00-00' ) );?>
generates:
<?php
Array
(
[year] => 2017
[month] => 0
[day] => 0
[hour] =>
[minute] =>
[second] =>
[fraction] =>
[warning_count] => 1
[warnings] => Array
(
[11] => The parsed date was invalid
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] =>
)
?>
Example 2: Month and day only
<?php print_r( date_parse( '0000-03-29' ) )?>
generates:
<?php
Array
(
[year] => 0
[month] => 3
[day] => 29
[hour] =>
[minute] =>
[second] =>
[fraction] =>
[warning_count] => 1
[warnings] => Array
(
[11] => The parsed date was invalid
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] =>
)
?>
However, simply omitting date elements gives PHP too much discretion in second-guessing our intentions:
Example 3: Truncated date:
<?php print_r( date_parse( '2017-03' ) )?>
generates:
<?php
Array
(
[year] => 2017
[month] => 3
[day] => 1
[hour] =>
[minute] =>
[second] =>
[fraction] =>
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] =>
)?>
In this case, PHP supplies a day value of 1 and does not report a warning.
Similarly, this feature of accepting zero date elements does not carry over to timestamps:
<?php $dDate = strtotime( '2017-03-00' );
print_r( getdate( $dDate ) ); ?>
displays:
<?php Array
(
[seconds] => 0
[minutes] => 0
[hours] => 0
[mday] => 28
[wday] => 2
[mon] => 2
[year] => 2017
[yday] => 58
[weekday] => Tuesday
[month] => February
[0] => 1488268800
)
?>
In this case, PHP interprets the "zeroth" day of March to be the last day of February.
Passing "YYYY-MM" results in a valid date. Be careful to validate that your submitted date passed YOUR requirements.
Developers, be aware that using "now" will return an empty array, ex :
<?php
date_parse("now");
?>
Will return :
Array
(
[year] =>
[month] =>
[day] =>
[hour] =>
[minute] =>
[second] =>
[fraction] =>
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] =>
)