note 80866 added to ref.datetime

From: Date: Tue, 05 Feb 2008 00:56:13 +0000
Subject: note 80866 added to ref.datetime
Groups: php.notes 
Request: Send a blank email to php-notes+get-135777@lists.php.net to get a copy of this message
Here's my version of date diff that handles leap years, DST, and deals with the diff in terms of "human calculations". For example, this code does not assume that a year = 365.25 days, or that a month = 30/31 days. The results are exactly what a human being would determine as a good result. <? /** * this code assumes php >= 5.1.0. if using < 5.1, read * php.net/strtotime and change the condition for checking * for failure from strtotime() */ // $t1, $t2: unix times, or strtotime parseable // $precision: max number of units to output // $abbr: if true, use "hr" instead of "hour", etc. function date_diff ($t1, $t2, $precision = 6, $abbr = false) { if (preg_match('/\D/', $t1) && ($t1 = strtotime($t1)) === false) return false; if (preg_match('/\D/', $t2) && ($t2 = strtotime($t2)) === false) return false; if ($t1 > $t2) list($t1, $t2) = array($t2, $t1); $diffs = array( 'year' => 0, 'month' => 0, 'day' => 0, 'hour' => 0, 'minute' => 0, 'second' => 0, ); $abbrs = array( 'year' => 'yr', 'month' => 'mth', 'day' => 'day', 'hour' => 'hr', 'minute' => 'min', 'second' => 'sec' ); foreach (array_keys($diffs) as $interval) { while ($t2 >= ($t3 = strtotime("+1 ${interval}", $t1))) { $t1 = $t3; ++$diffs[$interval]; } } $stack = array(); foreach ($diffs as $interval => $num) $stack[] = array($num, ($abbr ? $abbrs[$interval] : $interval) . ($num != 1 ? 's' : '')); $ret = array(); while (count($ret) < $precision && ($item = array_shift($stack)) !== null) { if ($item[0] > 0) $ret[] = "{$item[0]} {$item[1]}"; } return implode(', ', $ret); } $t1 = 'Feb 4, 2008 12:16:00'; $t2 = 'Jul 3, 2006 16:15:30'; echo date_diff($t1, $t2), "\n", date_diff($t1, $t2, 3), "\n", date_diff($t1, $t2, 2, true), "\n"; ?> ---- Server IP: 216.235.15.211 Probable Submitter: 66.130.16.8 ---- Manual Page -- http://www.php.net/manual/en/ref.datetime.php Edit -- https://master.php.net/note/edit/80866 Del: integrated -- https://master.php.net/note/delete/80866/integrated Del: useless -- https://master.php.net/note/delete/80866/useless Del: bad code -- https://master.php.net/note/delete/80866/bad+code Del: spam -- https://master.php.net/note/delete/80866/spam Del: non-english -- https://master.php.net/note/delete/80866/non-english Del: in docs -- https://master.php.net/note/delete/80866/in+docs Del: other reasons-- https://master.php.net/note/delete/80866 Reject -- https://master.php.net/note/reject/80866 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#135777) next »