PHP를 사용하여 두 날짜의 차이를 계산하는 방법은 무엇입니까?
PHPPHP를 사용하여 두 날짜의 차이를 계산하는 방법은 무엇입니까?
나는 형식의 두 날짜 :
Start Date: 2007-03-24
End Date: 2009-06-26
이제 다음 두 가지 형식의 차이점을 찾아야합니다.
2 years, 3 months and 2 days
어떻게하면 PHP에서이 작업을 수행 할 수 있습니까?
해결법
-
==============================
1.
strtotime ()을 사용하여 두 날짜를 유닉스 시간으로 변환 한 다음 이들 사이의 초 수를 계산할 수 있습니다. 이것으로 여러 기간을 계산하는 것이 쉽습니다.
$date1 = "2007-03-24"; $date2 = "2009-06-26"; $diff = abs(strtotime($date2) - strtotime($date1)); $years = floor($diff / (365*60*60*24)); $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24)); $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24)); printf("%d years, %d months, %d days\n", $years, $months, $days);
편집 : 분명히 이것을하는 선호하는 방법은 jurka에 의해 아래에 설명 된 것과 같습니다. 내 코드는 일반적으로 PHP 5.3 이상이없는 경우에만 권장됩니다.
의견에있는 몇몇 사람들은 위의 코드가 근사치 일 뿐이라고 지적했습니다. 나는 여전히 대부분의 용도로 괜찮다고 생각합니다. 왜냐하면 범위의 사용은 정밀도를 제공하는 것보다 오히려 시간이 경과했거나 남은 것의 의미를 제공하기위한 것이기 때문에 - 그렇게하고 싶다면 날짜를 출력하십시오.
이 모든 노력에도 불구하고 불만 사항을 해결하기로 결정했습니다. 정확한 범위가 필요하지만 PHP 5.3에 액세스 할 수없는 경우 아래 코드를 사용하십시오 (PHP 4에서도 작동 할 것입니다). 이것은 일광 절약 시간을 고려하지 않고 PHP가 범위를 계산하기 위해 내부적으로 사용하는 코드의 직접 포트입니다. 즉, 한시간 정도의 시간이 걸린다는 것을 의미합니다. 그러나 그 사실을 제외하고는 정확해야합니다.
<?php /** * Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff() * implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved. * * See here for original code: * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup */ function _date_range_limit($start, $end, $adj, $a, $b, $result) { if ($result[$a] < $start) { $result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1; $result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1); } if ($result[$a] >= $end) { $result[$b] += intval($result[$a] / $adj); $result[$a] -= $adj * intval($result[$a] / $adj); } return $result; } function _date_range_limit_days($base, $result) { $days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); $days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); _date_range_limit(1, 13, 12, "m", "y", &$base); $year = $base["y"]; $month = $base["m"]; if (!$result["invert"]) { while ($result["d"] < 0) { $month--; if ($month < 1) { $month += 12; $year--; } $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0); $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month]; $result["d"] += $days; $result["m"]--; } } else { while ($result["d"] < 0) { $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0); $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month]; $result["d"] += $days; $result["m"]--; $month++; if ($month > 12) { $month -= 12; $year++; } } } return $result; } function _date_normalize($base, $result) { $result = _date_range_limit(0, 60, 60, "s", "i", $result); $result = _date_range_limit(0, 60, 60, "i", "h", $result); $result = _date_range_limit(0, 24, 24, "h", "d", $result); $result = _date_range_limit(0, 12, 12, "m", "y", $result); $result = _date_range_limit_days(&$base, &$result); $result = _date_range_limit(0, 12, 12, "m", "y", $result); return $result; } /** * Accepts two unix timestamps. */ function _date_diff($one, $two) { $invert = false; if ($one > $two) { list($one, $two) = array($two, $one); $invert = true; } $key = array("y", "m", "d", "h", "i", "s"); $a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one)))); $b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two)))); $result = array(); $result["y"] = $b["y"] - $a["y"]; $result["m"] = $b["m"] - $a["m"]; $result["d"] = $b["d"] - $a["d"]; $result["h"] = $b["h"] - $a["h"]; $result["i"] = $b["i"] - $a["i"]; $result["s"] = $b["s"] - $a["s"]; $result["invert"] = $invert ? 1 : 0; $result["days"] = intval(abs(($one - $two)/86400)); if ($invert) { _date_normalize(&$a, &$result); } else { _date_normalize(&$b, &$result); } return $result; } $date = "1986-11-10 19:37:22"; print_r(_date_diff(strtotime($date), time())); print_r(_date_diff(time(), strtotime($date)));
-
==============================
2.
DateTime 및 DateInterval 객체를 사용하는 것이 좋습니다.
$date1 = new DateTime("2007-03-24"); $date2 = new DateTime("2009-06-26"); $interval = $date1->diff($date2); echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; // shows the total amount of days (not divided into years, months and days like above) echo "difference " . $interval->days . " days ";
php DateTime :: diff 매뉴얼 더 읽기
매뉴얼에서 :
$date1 = new DateTime("now"); $date2 = new DateTime("tomorrow"); var_dump($date1 == $date2); // bool(false) var_dump($date1 < $date2); // bool(true) var_dump($date1 > $date2); // bool(false)
-
==============================
3.
가장 좋은 방법은 PHP의 DateTime (및 DateInterval) 객체를 사용하는 것입니다. 각 날짜는 DateTime 개체에 캡슐화 된 다음 두 날짜 간의 차이를 만들 수 있습니다.
$first_date = new DateTime("2012-11-30 17:03:30"); $second_date = new DateTime("2012-12-21 00:00:00");
DateTime 객체는 strtotime ()과 같은 형식을 허용합니다. 훨씬 더 구체적인 날짜 형식이 필요한 경우 DateTime :: createFromFormat ()을 사용하여 DateTime 객체를 만들 수 있습니다.
두 개체가 모두 인스턴스화 된 후 DateTime :: diff ()를 사용하여 다른 개체를 뺍니다.
$difference = $first_date->diff($second_date);
$ difference는 이제 차이 정보로 DateInterval 객체를 보유합니다. var_dump ()는 다음과 같습니다 :
object(DateInterval) public 'y' => int 0 public 'm' => int 0 public 'd' => int 20 public 'h' => int 6 public 'i' => int 56 public 's' => int 30 public 'invert' => int 0 public 'days' => int 20
DateInterval 객체의 서식을 지정하려면 각 값을 검사하고 0 인 경우 제외해야합니다.
/** * Format an interval to show all existing components. * If the interval doesn't have a time component (years, months, etc) * That component won't be displayed. * * @param DateInterval $interval The interval * * @return string Formatted interval string. */ function format_interval(DateInterval $interval) { $result = ""; if ($interval->y) { $result .= $interval->format("%y years "); } if ($interval->m) { $result .= $interval->format("%m months "); } if ($interval->d) { $result .= $interval->format("%d days "); } if ($interval->h) { $result .= $interval->format("%h hours "); } if ($interval->i) { $result .= $interval->format("%i minutes "); } if ($interval->s) { $result .= $interval->format("%s seconds "); } return $result; }
이제 남은 것은 $ difference DateInterval 객체에서 함수를 호출하는 것입니다.
echo format_interval($difference);
그리고 우리는 올바른 결과를 얻습니다.
목표를 달성하는 데 사용 된 전체 코드는 다음과 같습니다.
/** * Format an interval to show all existing components. * If the interval doesn't have a time component (years, months, etc) * That component won't be displayed. * * @param DateInterval $interval The interval * * @return string Formatted interval string. */ function format_interval(DateInterval $interval) { $result = ""; if ($interval->y) { $result .= $interval->format("%y years "); } if ($interval->m) { $result .= $interval->format("%m months "); } if ($interval->d) { $result .= $interval->format("%d days "); } if ($interval->h) { $result .= $interval->format("%h hours "); } if ($interval->i) { $result .= $interval->format("%i minutes "); } if ($interval->s) { $result .= $interval->format("%s seconds "); } return $result; } $first_date = new DateTime("2012-11-30 17:03:30"); $second_date = new DateTime("2012-12-21 00:00:00"); $difference = $first_date->diff($second_date); echo format_interval($difference);
-
==============================
4.
시간과 분 및 초보기 ..
$date1 = "2008-11-01 22:45:00"; $date2 = "2009-12-04 13:44:01"; $diff = abs(strtotime($date2) - strtotime($date1)); $years = floor($diff / (365*60*60*24)); $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24)); $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24)); $hours = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60)); $minuts = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60); $seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60)); printf("%d years, %d months, %d days, %d hours, %d minuts\n, %d seconds\n", $years, $months, $days, $hours, $minuts, $seconds);
-
==============================
5.
다음 링크를 살펴보십시오. 이것은 지금까지 찾은 최고의 대답입니다 :)
function dateDiff ($d1, $d2) { // Return the number of days between the two dates: return round(abs(strtotime($d1) - strtotime($d2))/86400); } // end function dateDiff
http://www.bizinfosys.com/php/date-difference.html
-
==============================
6.
jurka의 대답은 내가 좋아하는 것이기 때문에 투표했지만 pre-php.5.3 버전이 있습니다 ...
나는 비슷한 문제에 직면하고 있음을 깨달았습니다. 그것은 처음에이 질문에 어떻게 접근했는지를 보여주는 것입니다. 그러나 시간 차이가 필요했습니다. 하지만 제 기능은이 점도 매우 훌륭하게 해결했으며 잃어 버리지도 잊지 않을 곳을 유지하기 위해 내 라이브러리에 아무데도 없으므로 ... 이것이 누군가에게 유용하기를 바랍니다.
/** * * @param DateTime $oDate1 * @param DateTime $oDate2 * @return array */ function date_diff_array(DateTime $oDate1, DateTime $oDate2) { $aIntervals = array( 'year' => 0, 'month' => 0, 'week' => 0, 'day' => 0, 'hour' => 0, 'minute' => 0, 'second' => 0, ); foreach($aIntervals as $sInterval => &$iInterval) { while($oDate1 <= $oDate2){ $oDate1->modify('+1 ' . $sInterval); if ($oDate1 > $oDate2) { $oDate1->modify('-1 ' . $sInterval); break; } else { $iInterval++; } } } return $aIntervals; }
그리고 테스트 :
$oDate = new DateTime(); $oDate->modify('+111402189 seconds'); var_dump($oDate); var_dump(date_diff_array(new DateTime(), $oDate));
결과 :
object(DateTime)[2] public 'date' => string '2014-04-29 18:52:51' (length=19) public 'timezone_type' => int 3 public 'timezone' => string 'America/New_York' (length=16) array 'year' => int 3 'month' => int 6 'week' => int 1 'day' => int 4 'hour' => int 9 'minute' => int 3 'second' => int 8
여기에서 원래 아이디어를 얻었는데, 이는 내 용도에 맞게 수정 한 것입니다. (제 수정 내용도 해당 페이지에도 표시되기를 바랍니다.)
$ aIntervals 배열에서 제거하거나 어쩌면 $ aExclude 매개 변수를 추가하거나 문자열을 출력 할 때 필터를 제거하여 원하지 않는 간격 ( "week")을 쉽게 제거 할 수 있습니다.
-
==============================
7.
PHP 프레임 워크를 사용하고 있는지 여부는 모르겠지만 많은 PHP 프레임 워크에는 날짜 / 시간 라이브러리와 헬퍼가있어 사용자가 다시 개조하지 못하게합니다.
예를 들어 CodeIgniter에는 timespan () 함수가 있습니다. 단순히 두 개의 유닉스 타임 스탬프를 입력하면 자동으로 다음과 같은 결과가 생성됩니다 :
1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes
http://codeigniter.com/user_guide/helpers/date_helper.html
-
==============================
8.
<?php $today = strtotime("2011-02-03 00:00:00"); $myBirthDate = strtotime("1964-10-30 00:00:00"); printf("Days since my birthday: ", ($today - $myBirthDate)/60/60/24); ?>
-
==============================
9.
echo time_diff_string('2013-05-01 00:22:35', 'now'); echo time_diff_string('2013-05-01 00:22:35', 'now', true);
4 months ago 4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago
function time_diff_string($from, $to, $full = false) { $from = new DateTime($from); $to = new DateTime($to); $diff = $to->diff($from); $diff->w = floor($diff->d / 7); $diff->d -= $diff->w * 7; $string = array( 'y' => 'year', 'm' => 'month', 'w' => 'week', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'second', ); foreach ($string as $k => &$v) { if ($diff->$k) { $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : ''); } else { unset($string[$k]); } } if (!$full) $string = array_slice($string, 0, 1); return $string ? implode(', ', $string) . ' ago' : 'just now'; }
-
==============================
10.
당신은
getdate()
제공된 날짜 / 시간의 모든 요소를 포함하는 배열을 반환하는 함수 :
$diff = abs($endDate - $startDate); $my_t=getdate($diff); print("$my_t[year] years, $my_t[month] months and $my_t[mday] days");
시작일과 종료일이 문자열 형식 인 경우
$startDate = strtotime($startDateStr); $endDate = strtotime($endDateStr);
위의 코드 전에
-
==============================
11.
나는 그것에 대한 간단한 논리를 가지고있다.
<?php per_days_diff('2011-12-12','2011-12-29') function per_days_diff($start_date, $end_date) { $per_days = 0; $noOfWeek = 0; $noOfWeekEnd = 0; $highSeason=array("7", "8"); $current_date = strtotime($start_date); $current_date += (24 * 3600); $end_date = strtotime($end_date); $seassion = (in_array(date('m', $current_date), $highSeason))?"2":"1"; $noOfdays = array(''); while ($current_date <= $end_date) { if ($current_date <= $end_date) { $date = date('N', $current_date); array_push($noOfdays,$date); $current_date = strtotime('+1 day', $current_date); } } $finalDays = array_shift($noOfdays); //print_r($noOfdays); $weekFirst = array("week"=>array(),"weekEnd"=>array()); for($i = 0; $i < count($noOfdays); $i++) { if ($noOfdays[$i] == 1) { //echo "This is week"; //echo "<br/>"; if($noOfdays[$i+6]==7) { $noOfWeek++; $i=$i+6; } else { $per_days++; } //array_push($weekFirst["week"],$day); } else if($noOfdays[$i]==5) { //echo "This is weekend"; //echo "<br/>"; if($noOfdays[$i+2] ==7) { $noOfWeekEnd++; $i = $i+2; } else { $per_days++; } //echo "After weekend value:- ".$i; //echo "<br/>"; } else { $per_days++; } } /*echo $noOfWeek; echo "<br/>"; echo $noOfWeekEnd; echo "<br/>"; print_r($per_days); echo "<br/>"; print_r($weekFirst); */ $duration = array("weeks"=>$noOfWeek, "weekends"=>$noOfWeekEnd, "perDay"=>$per_days, "seassion"=>$seassion); return $duration; ?>
-
==============================
12.
// If you just want to see the year difference then use this function. // Using the logic I've created you may also create month and day difference // which I did not provide here so you may have the efforts to use your brain. // :) $date1='2009-01-01'; $date2='2010-01-01'; echo getYearDifference ($date1,$date2); function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){ $year = 0; while($date2 > $date1 = strtotime('+1 year', $date1)){ ++$year; } return $year; }
-
==============================
13.
이것은 내 기능이다. 필수 PHP> = 5.3.4. 그것은 DateTime 클래스를 사용합니다. 매우 빠르며 빠르며 두 날짜의 차이나 심지어는 "시간 이후"라고 할 수 있습니다.
if(function_exists('grk_Datetime_Since') === FALSE){ function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){ # Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenant if(empty($To) === TRUE){ $To = time(); } # On va s'assurer que $From est numérique if(is_int($From) === FALSE){ $From = strtotime($From); }; # On va s'assurer que $To est numérique if(is_int($To) === FALSE){ $To = strtotime($To); } # On a une erreur ? if($From === FALSE OR $From === -1 OR $To === FALSE OR $To === -1){ return FALSE; } # On va créer deux objets de date $From = new DateTime(@date('Y-m-d H:i:s', $From), new DateTimeZone('GMT')); $To = new DateTime(@date('Y-m-d H:i:s', $To), new DateTimeZone('GMT')); # On va calculer la différence entre $From et $To if(($Diff = $From->diff($To)) === FALSE){ return FALSE; } # On va merger le tableau des noms (par défaut, anglais) $Words = array_merge(array( 'year' => 'year', 'years' => 'years', 'month' => 'month', 'months' => 'months', 'week' => 'week', 'weeks' => 'weeks', 'day' => 'day', 'days' => 'days', 'hour' => 'hour', 'hours' => 'hours', 'minute' => 'minute', 'minutes' => 'minutes', 'second' => 'second', 'seconds' => 'seconds' ), $Words); # On va créer la chaîne maintenant if($Diff->y > 1){ $Text = $Diff->y.' '.$Words['years']; } elseif($Diff->y == 1){ $Text = '1 '.$Words['year']; } elseif($Diff->m > 1){ $Text = $Diff->m.' '.$Words['months']; } elseif($Diff->m == 1){ $Text = '1 '.$Words['month']; } elseif($Diff->d > 7){ $Text = ceil($Diff->d/7).' '.$Words['weeks']; } elseif($Diff->d == 7){ $Text = '1 '.$Words['week']; } elseif($Diff->d > 1){ $Text = $Diff->d.' '.$Words['days']; } elseif($Diff->d == 1){ $Text = '1 '.$Words['day']; } elseif($Diff->h > 1){ $Text = $Diff->h.' '.$Words['hours']; } elseif($Diff->h == 1){ $Text = '1 '.$Words['hour']; } elseif($Diff->i > 1){ $Text = $Diff->i.' '.$Words['minutes']; } elseif($Diff->i == 1){ $Text = '1 '.$Words['minute']; } elseif($Diff->s > 1){ $Text = $Diff->s.' '.$Words['seconds']; } else { $Text = '1 '.$Words['second']; } return $Prefix.$Text.$Suffix; } }
-
==============================
14.
이것은 타임 스탬프가 주어 졌는지의 여부를 탐지하려고 시도 할 것이고 미래의 날짜 / 시간을 음의 값으로 반환 할 것이다 :
<?php function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE) { // If $convert_to_timestamp is not explicitly set to TRUE, // check to see if it was accidental: if ($convert_to_timestamp || !is_numeric($start)) { // If $convert_to_timestamp is TRUE, convert to timestamp: $timestamp_start = strtotime($start); } else { // Otherwise, leave it as a timestamp: $timestamp_start = $start; } // Same as above, but make sure $end has actually been overridden with a non-null, // non-empty, non-numeric value: if (!is_null($end) && (!empty($end) && !is_numeric($end))) { $timestamp_end = strtotime($end); } else { // If $end is NULL or empty and non-numeric value, assume the end time desired // is the current time (useful for age, etc): $timestamp_end = time(); } // Regardless, set the start and end times to an integer: $start_time = (int) $timestamp_start; $end_time = (int) $timestamp_end; // Assign these values as the params for $then and $now: $start_time_var = 'start_time'; $end_time_var = 'end_time'; // Use this to determine if the output is positive (time passed) or negative (future): $pos_neg = 1; // If the end time is at a later time than the start time, do the opposite: if ($end_time <= $start_time) { $start_time_var = 'end_time'; $end_time_var = 'start_time'; $pos_neg = -1; } // Convert everything to the proper format, and do some math: $then = new DateTime(date('Y-m-d H:i:s', $$start_time_var)); $now = new DateTime(date('Y-m-d H:i:s', $$end_time_var)); $years_then = $then->format('Y'); $years_now = $now->format('Y'); $years = $years_now - $years_then; $months_then = $then->format('m'); $months_now = $now->format('m'); $months = $months_now - $months_then; $days_then = $then->format('d'); $days_now = $now->format('d'); $days = $days_now - $days_then; $hours_then = $then->format('H'); $hours_now = $now->format('H'); $hours = $hours_now - $hours_then; $minutes_then = $then->format('i'); $minutes_now = $now->format('i'); $minutes = $minutes_now - $minutes_then; $seconds_then = $then->format('s'); $seconds_now = $now->format('s'); $seconds = $seconds_now - $seconds_then; if ($seconds < 0) { $minutes -= 1; $seconds += 60; } if ($minutes < 0) { $hours -= 1; $minutes += 60; } if ($hours < 0) { $days -= 1; $hours += 24; } $months_last = $months_now - 1; if ($months_now == 1) { $years_now -= 1; $months_last = 12; } // "Thirty days hath September, April, June, and November" ;) if ($months_last == 9 || $months_last == 4 || $months_last == 6 || $months_last == 11) { $days_last_month = 30; } else if ($months_last == 2) { // Factor in leap years: if (($years_now % 4) == 0) { $days_last_month = 29; } else { $days_last_month = 28; } } else { $days_last_month = 31; } if ($days < 0) { $months -= 1; $days += $days_last_month; } if ($months < 0) { $years -= 1; $months += 12; } // Finally, multiply each value by either 1 (in which case it will stay the same), // or by -1 (in which case it will become negative, for future dates). // Note: 0 * 1 == 0 * -1 == 0 $out = new stdClass; $out->years = (int) $years * $pos_neg; $out->months = (int) $months * $pos_neg; $out->days = (int) $days * $pos_neg; $out->hours = (int) $hours * $pos_neg; $out->minutes = (int) $minutes * $pos_neg; $out->seconds = (int) $seconds * $pos_neg; return $out; }
사용 예 :
<?php $birthday = 'June 2, 1971'; $check_age_for_this_date = 'June 3, 1999 8:53pm'; $age = time_diff($birthday, $check_age_for_this_date)->years; print $age;// 28
또는:
<?php $christmas_2020 = 'December 25, 2020'; $countdown = time_diff($christmas_2020); print_r($countdown);
-
==============================
15.
"만약"날짜가 MySQL에 저장되어 있다면 데이터베이스 레벨에서 차이 계산을하는 것이 더 쉽다는 것을 알았습니다. 그런 다음 일,시, 분, 초 출력을 기반으로 적절한 결과를 파싱하고 표시하십시오 ...
mysql> select firstName, convert_tz(loginDate, '+00:00', '-04:00') as loginDate, TIMESTAMPDIFF(DAY, loginDate, now()) as 'Day', TIMESTAMPDIFF(HOUR, loginDate, now())+4 as 'Hour', TIMESTAMPDIFF(MINUTE, loginDate, now())+(60*4) as 'Min', TIMESTAMPDIFF(SECOND, loginDate, now())+(60*60*4) as 'Sec' from User_ where userId != '10158' AND userId != '10198' group by emailAddress order by loginDate desc; +-----------+---------------------+------+------+------+--------+ | firstName | loginDate | Day | Hour | Min | Sec | +-----------+---------------------+------+------+------+--------+ | Peter | 2014-03-30 18:54:40 | 0 | 4 | 244 | 14644 | | Keith | 2014-03-30 18:54:11 | 0 | 4 | 244 | 14673 | | Andres | 2014-03-28 09:20:10 | 2 | 61 | 3698 | 221914 | | Nadeem | 2014-03-26 09:33:43 | 4 | 109 | 6565 | 393901 | +-----------+---------------------+------+------+------+--------+ 4 rows in set (0.00 sec)
-
==============================
16.
PHP 날짜 시간 계산에 대한 여러 참조가 포함 된 다음 페이지에서 기사를 찾았습니다.
PHP를 사용하여 두 날짜 (및 시간)의 차이를 계산합니다. 다음 페이지는 PHP를 사용하여 날짜 / 시간 계산을 수행하여 두 날짜 사이의 시간 (시, 분), 일, 월 또는 년의 차이를 결정하는 다양한 방법 (총 7 개)을 제공합니다.
PHP 날짜 시간 - 7 날짜 차이를 계산하는 방법을 참조하십시오.
-
==============================
17.
date_create 및 date_diff 객체를 사용하는 것이 좋습니다.
암호:
$date1 = date_create("2007-03-24"); $date2 = date_create("2009-06-26"); $dateDifference = date_diff($date1, $date2)->format('%y years, %m months and %d days'); echo $dateDifference;
산출:
2 years, 3 months and 2 days
자세한 정보는 PHP date_diff 매뉴얼을 참조하십시오.
-
==============================
18.
다음 코드를 사용하여 날짜 차이를 반올림하여 반환 할 수도 있습니다 $ date1 = $ duedate; // 만료일 지정 echo $ date2 = date ( "Y-m-d"); // 현재 날짜 $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ datediff = ceil (($ seconds_diff / 3600) / 24); // 일 안에 반환
ceil 대신 php의 floor 메소드를 사용하면 round fraction을 반환합니다. 준비 서버 시간대가 다른 경우 라이브 사이트 시간대가 다른 경우 결과가 달라질 수 있으므로 여기에서 차이점을 확인하십시오. 따라서 조건을 적절하게 변경하십시오.
-
==============================
19.
$date1 = date_create('2007-03-24'); $date2 = date_create('2009-06-26'); $interval = date_diff($date1, $date2); echo "difference : " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days ";
-
==============================
20.
PHP 버전> = 5.3 : 두 개의 날짜 객체를 만든 다음 date_diff () 함수를 사용하십시오. php DateInterval 객체를 반환합니다. 문서를 보라.
$date1=date_create("2007-03-24"); $date2=date_create("2009-06-26"); $diff=date_diff($date1,$date2); echo $diff->format("%R%a days");
-
==============================
21.
나는 PHP 5.2에서 동일한 문제를 가지고 MySQL로 해결했다. 정확히 당신이 찾고있는 것이 아니 겠지만, 이것은 트릭을하고 며칠을 반환 할 것입니다 :
$datediff_q = $dbh->prepare("SELECT DATEDIFF(:date2, :date1)"); $datediff_q->bindValue(':date1', '2007-03-24', PDO::PARAM_STR); $datediff_q->bindValue(':date2', '2009-06-26', PDO::PARAM_STR); $datediff = ($datediff_q->execute()) ? $datediff_q->fetchColumn(0) : false;
여기에 대한 자세한 정보 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
-
==============================
22.
모두가 코드 샘플을 게시하기 때문에 여기에 다른 버전이 있습니다.
몇 초에서 몇 년 (단 하나의 단위)의 차이를 표시하는 기능이 필요했습니다. 1 일 이상의 기간 동안 자정에 롤오버하기를 원했습니다 (월요일 오전 10시, 오전 9시 수요일에서 2 일전에 1이 아닌 것으로 나타남). 한 달이 넘는 기간 동안 롤오버가 같은 날 (30/31 일 월 및 윤년 포함)에 있어야합니다.
이것이 내가 생각해 낸 것입니다.
/** * Returns how long ago something happened in the past, showing it * as n seconds / minutes / hours / days / weeks / months / years ago. * * For periods over a day, it rolls over at midnight (so doesn't depend * on current time of day), and it correctly accounts for month-lengths * and leap-years (months and years rollover on current day of month). * * $param string $timestamp in DateTime format * $return string description of interval */ function ago($timestamp) { $then = date_create($timestamp); // for anything over 1 day, make it rollover on midnight $today = date_create('tomorrow'); // ie end of today $diff = date_diff($then, $today); if ($diff->y > 0) return $diff->y.' year'.($diff->y>1?'s':'').' ago'; if ($diff->m > 0) return $diff->m.' month'.($diff->m>1?'s':'').' ago'; $diffW = floor($diff->d / 7); if ($diffW > 0) return $diffW.' week'.($diffW>1?'s':'').' ago'; if ($diff->d > 1) return $diff->d.' day'.($diff->d>1?'s':'').' ago'; // for anything less than 1 day, base it off 'now' $now = date_create(); $diff = date_diff($then, $now); if ($diff->d > 0) return 'yesterday'; if ($diff->h > 0) return $diff->h.' hour'.($diff->h>1?'s':'').' ago'; if ($diff->i > 0) return $diff->i.' minute'.($diff->i>1?'s':'').' ago'; return $diff->s.' second'.($diff->s==1?'':'s').' ago'; }
-
==============================
23.
예전에는 format_date 함수를 작성 했으므로 날짜를 원하는 방식에 대한 많은 옵션을 제공합니다.
function format_date($date, $type, $seperator="-") { if($date) { $day = date("j", strtotime($date)); $month = date("n", strtotime($date)); $year = date("Y", strtotime($date)); $hour = date("H", strtotime($date)); $min = date("i", strtotime($date)); $sec = date("s", strtotime($date)); switch($type) { case 0: $date = date("Y".$seperator."m".$seperator."d",mktime($hour, $min, $sec, $month, $day, $year)); break; case 1: $date = date("D, F j, Y",mktime($hour, $min, $sec, $month, $day, $year)); break; case 2: $date = date("d".$seperator."m".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break; case 3: $date = date("d".$seperator."M".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break; case 4: $date = date("d".$seperator."M".$seperator."Y h:i A",mktime($hour, $min, $sec, $month, $day, $year)); break; case 5: $date = date("m".$seperator."d".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break; case 6: $date = date("M",mktime($hour, $min, $sec, $month, $day, $year)); break; case 7: $date = date("Y",mktime($hour, $min, $sec, $month, $day, $year)); break; case 8: $date = date("j",mktime($hour, $min, $sec, $month, $day, $year)); break; case 9: $date = date("n",mktime($hour, $min, $sec, $month, $day, $year)); break; case 10: $diff = abs(strtotime($date) - strtotime(date("Y-m-d h:i:s"))); $years = floor($diff / (365*60*60*24)); $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24)); $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24)); $date = $years . " years, " . $months . " months, " . $days . "days"; } } return($date); }
-
==============================
24.
매우 간단합니다 :
<?php $date1 = date_create("2007-03-24"); echo "Start date: ".$date1->format("Y-m-d")."<br>"; $date2 = date_create("2009-06-26"); echo "End date: ".$date2->format("Y-m-d")."<br>"; $diff = date_diff($date1,$date2); echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>"; ?>
자세한 내용은 다음 링크를 확인하십시오.
PHP : date_diff - Manual
그것은 PHP 5.3.0 이상을위한 것입니다.
-
==============================
25.
년과 월 (즉, 1 년 4 개월)의 나이를 반환 할 수있는 다음 함수를 항상 사용할 수 있습니다.
function getAge($dob, $age_at_date) { $d1 = new DateTime($dob); $d2 = new DateTime($age_at_date); $age = $d2->diff($d1); $years = $age->y; $months = $age->m; return $years.'.'.months; }
또는 현재 날짜로 나이를 계산하려면 다음을 사용할 수 있습니다.
function getAge($dob) { $d1 = new DateTime($dob); $d2 = new DateTime(date()); $age = $d2->diff($d1); $years = $age->y; $months = $age->m; return $years.'.'.months; }
-
==============================
26.
쉬운 기능
function time_difference($time_1, $time_2, $limit = null) { $val_1 = new DateTime($time_1); $val_2 = new DateTime($time_2); $interval = $val_1->diff($val_2); $output = array( "year" => $interval->y, "month" => $interval->m, "day" => $interval->d, "hour" => $interval->h, "minute" => $interval->i, "second" => $interval->s ); $return = ""; foreach ($output AS $key => $value) { if ($value == 1) $return .= $value . " " . $key . " "; elseif ($value >= 1) $return .= $value . " " . $key . "s "; if ($key == $limit) return trim($return); } return trim($return); }
좋아요 사용
echo time_difference ($ time_1, $ time_2, "day");
2 년 8 개월 2 일 같이 돌아갑니다.
-
==============================
27.
PHP 5.3 (각각 date_diff ())을 사용할 수 없을 때 필자가 작성한 다음 함수를 사용하고 있습니다.
function dateDifference($startDate, $endDate) { $startDate = strtotime($startDate); $endDate = strtotime($endDate); if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0 || $startDate > $endDate) return false; $years = date('Y', $endDate) - date('Y', $startDate); $endMonth = date('m', $endDate); $startMonth = date('m', $startDate); // Calculate months $months = $endMonth - $startMonth; if ($months <= 0) { $months += 12; $years--; } if ($years < 0) return false; // Calculate the days $measure = ($months == 1) ? 'month' : 'months'; $days = $endDate - strtotime('+' . $months . ' ' . $measure, $startDate); $days = date('z', $days); return array($years, $months, $days); }
-
==============================
28.
DateInterval은 훌륭하지만 다음과 같은 몇 가지주의 사항이 있습니다.
이를 극복하기 위해 다음 코드를 작성했습니다 (@enobrev 응답 향상).
function date_dif($since, $until, $keys = 'year|month|week|day|hour|minute|second') { $date = array_map('strtotime', array($since, $until)); if ((count($date = array_filter($date, 'is_int')) == 2) && (sort($date) === true)) { $result = array_fill_keys(explode('|', $keys), 0); foreach (preg_grep('~^(?:year|month)~i', $result) as $key => $value) { while ($date[1] >= strtotime(sprintf('+%u %s', $value + 1, $key), $date[0])) { ++$value; } $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]); } foreach (preg_grep('~^(?:year|month)~i', $result, PREG_GREP_INVERT) as $key => $value) { if (($value = intval(abs($date[0] - $date[1]) / strtotime(sprintf('%u %s', 1, $key), 0))) > 0) { $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]); } } return $result; } return false; }
두 개의 루프를 실행합니다. 첫 번째 것은 brute-forcing을 통해 상대적인 간격 (년과 월)을 처리하고 두 번째 것은 간단한 산술로 추가 절대 간격을 계산합니다 (따라서 더 빠름).
echo humanize(date_dif('2007-03-24', '2009-07-31', 'second')); // 74300400 seconds echo humanize(date_dif('2007-03-24', '2009-07-31', 'minute|second')); // 1238400 minutes, 0 seconds echo humanize(date_dif('2007-03-24', '2009-07-31', 'hour|minute|second')); // 20640 hours, 0 minutes, 0 seconds echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|day')); // 2 years, 129 days echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week')); // 2 years, 18 weeks echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week|day')); // 2 years, 18 weeks, 3 days echo humanize(date_dif('2007-03-24', '2009-07-31')); // 2 years, 4 months, 1 week, 0 days, 0 hours, 0 minutes, 0 seconds function humanize($array) { $result = array(); foreach ($array as $key => $value) { $result[$key] = $value . ' ' . $key; if ($value != 1) { $result[$key] .= 's'; } } return implode(', ', $result); }
-
==============================
29.
페니를 위해, 파운드를 위해 : 몇 가지 솔루션을 검토 한 결과 모두 25 년, 11 개월 및 20 일 동안 26 개월 12 개월 및 2 일 솔루션으로 반올림 한 floor ()를 사용하여 복잡한 솔루션을 제공했습니다 !!!!
여기에이 문제의 제 버전이 있습니다 : 우아하지 않을 수도 있고 잘 코딩되지 않을 수도 있지만 LEAP 연도를 계산하지 않으면 더 가까운 거리에있는 답을 제공합니다. 분명히 윤년을 코딩 할 수는 있지만이 경우에는 - 다른 사람이 말했듯이 이 대답을 제공하십시오 :: 결과의 구성을보다 명확하게 볼 수 있도록 모든 테스트 조건과 print_r을 포함했습니다. 여기 간다.
// 입력 날짜 / 변수를 설정하십시오 ::
$ISOstartDate = "1987-06-22"; $ISOtodaysDate = "2013-06-22";
// 다음과 같이 ISO yyyy-mm-dd 형식을 yyyy mm dd로 추출해야합니다.
$ y 날짜 [] = 폭발 됨 ( '-', $ ISO startDate); print_r ($ Date);
$ zDate [] = 폭발 ( '-', $ ISOtodaysDate); print_r ($ zDate);
// Lets Sort of the Years! // Lets Sort out the difference in YEARS between startDate and todaysDate :: $years = $zDate[0][0] - $yDate[0][0]; // We need to collaborate if the month = month = 0, is before or after the Years Anniversary ie 11 months 22 days or 0 months 10 days... if ($months == 0 and $zDate[0][1] > $ydate[0][1]) { $years = $years -1; } // TEST result echo "\nCurrent years => ".$years; // Lets Sort out the difference in MONTHS between startDate and todaysDate :: $months = $zDate[0][1] - $yDate[0][1]; // TEST result echo "\nCurrent months => ".$months; // Now how many DAYS has there been - this assumes that there is NO LEAP years, so the calculation is APPROXIMATE not 100% // Lets cross reference the startDates Month = how many days are there in each month IF m-m = 0 which is a years anniversary // We will use a switch to check the number of days between each month so we can calculate days before and after the years anniversary switch ($yDate[0][1]){ case 01: $monthDays = '31'; break; // Jan case 02: $monthDays = '28'; break; // Feb case 03: $monthDays = '31'; break; // Mar case 04: $monthDays = '30'; break; // Apr case 05: $monthDays = '31'; break; // May case 06: $monthDays = '30'; break; // Jun case 07: $monthDays = '31'; break; // Jul case 08: $monthDays = '31'; break; // Aug case 09: $monthDays = '30'; break; // Sept case 10: $monthDays = '31'; break; // Oct case 11: $monthDays = '30'; break; // Nov case 12: $monthDays = '31'; break; // Dec }; // TEST return echo "\nDays in start month ".$yDate[0][1]." => ".$monthDays; // Lets correct the problem with 0 Months - is it 11 months + days, or 0 months +days??? $days = $zDate[0][2] - $yDate[0][2] +$monthDays; echo "\nCurrent days => ".$days."\n"; // Lets now Correct the months to being either 11 or 0 Months, depending upon being + or - the years Anniversary date // At the same time build in error correction for Anniversary dates not being 1yr 0m 31d... see if ($days == $monthDays ) if($days < $monthDays && $months == 0) { $months = 11; // If Before the years anniversary date } else { $months = 0; // If After the years anniversary date $years = $years+1; // Add +1 to year $days = $days-$monthDays; // Need to correct days to how many days after anniversary date }; // Day correction for Anniversary dates if ($days == $monthDays ) // if todays date = the Anniversary DATE! set days to ZERO { $days = 0; // days set toZERO so 1 years 0 months 0 days }; echo "\nTherefore, the number of years/ months/ days/ \nbetween start and todays date::\n\n"; printf("%d years, %d months, %d days\n", $years, $months, $days);
최종 결과는 :: 26 년, 0 개월, 0 일
그것이 2013 년 6 월 22 일에 얼마나 오랫동안 사업에 종사했는지입니다.
-
==============================
30.
다음은 실행 가능한 코드입니다.
$date1=date_create('2007-03-24'); $date2=date_create('2009-06-26'); $diff1=date_diff($date1,$date2); $daysdiff= $diff1->format("%R%a"); $daysdiff=abs($daysdiff);
from https://stackoverflow.com/questions/676824/how-to-calculate-the-difference-between-two-dates-using-php by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PHP에서 리디렉션을 만드는 방법은 무엇입니까? (0) | 2018.09.01 |
---|---|
PHP로 jQuery Ajax POST 예제 (0) | 2018.09.01 |
3 개의 다른 동등 물 (0) | 2018.09.01 |
PHP 암호를위한 안전한 해시 및 소금 (0) | 2018.09.01 |
클렌징 사용자 암호 (0) | 2018.09.01 |