Gunakan ini untuk kode lawas (PHP <5.3). Untuk solusi terkini lihat jawaban jurka di bawah ini
Anda dapat menggunakan strtotime () untuk mengonversi dua tanggal menjadi waktu unix dan kemudian menghitung jumlah detik di antaranya. Dari sini agak mudah untuk menghitung periode waktu yang berbeda.
Sunting: Jelas cara yang disukai untuk melakukan ini seperti dijelaskan oleh jurka di bawah ini. Kode saya umumnya hanya disarankan jika Anda tidak memiliki PHP 5.3 atau lebih baik.
Beberapa orang di komentar telah menunjukkan bahwa kode di atas hanyalah perkiraan. Saya masih percaya bahwa untuk sebagian besar tujuan itu baik-baik saja, karena penggunaan rentang lebih untuk memberikan rasa berapa banyak waktu telah berlalu atau tetap daripada memberikan presisi - jika Anda ingin melakukan itu, cukup tampilkan tanggal.
Terlepas dari semua itu, saya telah memutuskan untuk menangani keluhan. Jika Anda benar-benar membutuhkan kisaran yang tepat tetapi belum mendapatkan akses ke PHP 5.3, gunakan kode di bawah ini (ini juga bisa digunakan di PHP 4). Ini adalah port langsung dari kode yang digunakan PHP secara internal untuk menghitung rentang, dengan pengecualian bahwa itu tidak memperhitungkan waktu musim panas. Itu berarti paling tidak satu jam, tapi kecuali itu harus benar.
<?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)));
Jika Anda menggunakan kelas DateTime, Anda bisa menggunakan format $ date-> ('U') untuk mendapatkan cap waktu unix.
Jon Cram
4
Itu tidak benar jika Anda harus berurusan dengan musim panas / musim dingin. Dalam kasus khusus ini ketika Anda menyesuaikan waktu musim panas / musim dingin, satu hari sama dengan 23 atau 25 jam.
Arno
4
Nah, argumen yang sama bisa dibuat untuk tahun kabisat. Itu tidak memperhitungkannya juga. Tetap saja, saya tidak yakin bahwa Anda bahkan ingin memperhitungkannya karena kami sedang mendiskusikan kisaran di sini. Semantik untuk rentang agak berbeda dari untuk tanggal absolut.
Emil H
9
Fungsi ini salah. Ini bagus untuk perkiraan, tetapi tidak tepat untuk rentang yang tepat. Untuk satu, ia mengasumsikan ada 30 hari dalam sebulan, yang artinya akan memiliki perbedaan hari yang sama antara 1 Februari dan 1 Maret seperti pada 1 Juli hingga 1 Agustus (terlepas dari tahun kabisat).
enobrev
1
Di PHP, variabel referensi ada di tanda tangan fungsi, bukan panggilan. Pindahkan semua milik Anda &ke tanda tangan.
Paul Tarjan
909
Saya menyarankan untuk menggunakan objek DateTime dan DateInterval.
$date1 =newDateTime("2007-03-24");
$date2 =newDateTime("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 ";
+1 DateTime menangani tahun kabisat dan zona waktu dengan benar dan ada buku bagus untuk rak: phparch.com/books/…
hakre
3
Apakah ada metode yang memberikan jumlah total detik antara kedua DateTimes? (tanpa menambahkan komponen, yaitu)
potatoe
1
@Panique $ interval-> hari dan $ interval-> d adalah ukuran yang berbeda. komentar Anda di atas benar "menunjukkan jumlah total hari (tidak dibagi menjadi tahun, bulan, dan hari-hari seperti di atas)"
jurka
1
@ potatoe Anda mungkin ingin $date2->format('U') - $date1->format('U').
Paulo Freitas
3
perhatikan bahwa ada bug di mana DateInterval memiliki properti hari salah ( selalu 6015 ) di Windows dengan beberapa versi PHP: bugs.php.net/bug.php?id=51184 (lihat komentar di sana untuk diperbaiki / diperbaiki)
Pim Schaaf
73
Tindakan terbaik adalah menggunakan objek PHP DateTime(dan DateInterval). Setiap tanggal dienkapsulasi dalam suatu DateTimeobjek, dan kemudian perbedaan antara keduanya dapat dibuat:
The DateTimeobjek akan menerima format apapun strtotime()akan. Jika diperlukan format tanggal yang lebih spesifik, DateTime::createFromFormat()dapat digunakan untuk membuat DateTimeobjek.
Setelah kedua objek dipakai, Anda mengurangi satu dari yang lain dengan DateTime::diff().
$difference = $first_date->diff($second_date);
$differencesekarang memegang DateIntervalobjek dengan informasi perbedaan. A var_dump()terlihat seperti ini:
Kami memiliki masalah, bertukar first_date ke second_date dan kami mendapatkan hasil yang sama? Mengapa tidak mengatakan 0 hari 0 jam 0 menit 0 detik atau hanya 0. Contoh: 2012-11-30 17:03:30 - 2012-12-21 00:00:00 dan 2012-12-21 00:00:00 - 2012-11-30 17:03:30 mendapatkan hasil yang sama.
EgoistDeveloper
Karena diff memberi Anda perbedaan antara dua kali. Perbedaannya bukan 0 terlepas dari tanggal yang datang kemudian.
Hantu Madara
1
Ini adalah jawaban yang sangat bagus karena menyediakan fungsi yang jelas yang dapat dipanggil dari mana saja dalam basis kode tanpa banyak waktu. Jawaban yang lain memungkinkan Anda untuk melepaskan calcs yang di echo dengan cepat yang mengatasi gejala alih-alih menyelesaikan masalah ... Satu-satunya elemen yang saya tambahkan (dan hampir semua posting lainnya tidak membahas hal ini) adalah pluralisasi $ elemen interval jika lebih dari 1.
Mungkin ini tidak akan memberikan hasil yang akurat.
Dolphin
8
Dan merupakan solusi yang mengerikan kecuali Anda dipaksa untuk menggunakan versi PHP yang sangat ketinggalan jaman ...
rdlowrey
2
Tidak terlalu KERING . Misalnya, 60 * 60 * 24 diulang 15 kali. Salin-tempel ulang pakai lama!
Peter Mortensen
Bagaimana dengan tahun kabisat? Satu tahun bukan rata-rata 365 hari.
Peter Mortensen
Kode ini mengasumsikan sebulan rata-rata 30 hari. Bahkan dengan asumsi 365 hari selama setahun, bulan rata-rata adalah 365/12 = 30,42 hari (rata-rata).
Peter Mortensen
18
Lihatlah tautan berikut. Ini jawaban terbaik yang saya temukan sejauh ini .. :)
function dateDiff ($d1, $d2){// Return the number of days between the two dates: return round(abs(strtotime($d1)- strtotime($d2))/86400);}// end function dateDiff
Tidak masalah tanggal mana yang lebih awal atau lebih lambat ketika Anda memasukkan parameter tanggal. Fungsi ini menggunakan nilai absolut PHP ABS () untuk selalu mengembalikan nomor postive sebagai jumlah hari antara kedua tanggal.
Perlu diingat bahwa jumlah hari antara kedua tanggal tersebut TIDAK termasuk kedua tanggal. Jadi jika Anda mencari jumlah hari yang diwakili oleh semua tanggal antara dan termasuk tanggal yang dimasukkan, Anda perlu menambahkan satu (1) ke hasil fungsi ini.
Misalnya, perbedaan (seperti yang dikembalikan oleh fungsi di atas) antara 2013-02-09 dan 2013-02-14 adalah 5. Tetapi jumlah hari atau tanggal yang diwakili oleh rentang tanggal 2013-02-09 - 2013-02- 14 adalah 6.
Pertanyaannya menanyakan perbedaannya seperti jumlah tahun, bulan dan hari, bukan jumlah hari.
Peter Mortensen
14
Saya memilih jurka 's jawaban seperti itulah favorit saya, tapi saya memiliki versi pre-php.5.3 ...
Saya menemukan diri saya mengerjakan masalah yang sama - yaitu bagaimana saya sampai pada pertanyaan ini - tetapi hanya perlu perbedaan dalam jam. Tapi fungsi saya menyelesaikan yang satu ini dengan cukup baik dan saya tidak punya tempat di perpustakaan saya sendiri untuk menyimpannya di tempat yang tidak akan hilang dan dilupakan, jadi ... semoga ini berguna bagi seseorang.
Saya mendapatkan ide asli dari sini , yang saya modifikasi untuk penggunaan saya (dan saya harap modifikasi saya akan ditampilkan di halaman itu juga).
Anda dapat dengan mudah menghapus interval yang tidak Anda inginkan (katakan "minggu") dengan menghapusnya dari $aIntervalsarray, atau mungkin menambahkan $aExcludeparameter, atau cukup filter keluar ketika Anda menghasilkan string.
Sayangnya ini tidak mengembalikan hal yang sama dengan DateInterval karena tahun / bulan meluap.
Stephen Harris
2
@StephenHarris: Saya belum menguji ini, tetapi dengan membaca kode saya cukup yakin itu akan mengembalikan hasil yang sama - asalkan Anda menghapus weekindeks $aIntervals(karena DateDifftidak pernah menggunakan itu).
Alix Axel
Ini adalah solusi yang bagus untuk menemukan tanggal yang terjadi setiap interval antara dua tanggal.
otak
14
<?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);?>
Pertanyaannya menanyakan perbedaannya seperti jumlah tahun , bulan , dan hari . Ini menghasilkan perbedaan sebagai jumlah total hari.
Peter Mortensen
11
Saya tidak tahu apakah Anda menggunakan kerangka kerja PHP atau tidak, tetapi banyak kerangka kerja PHP memiliki pustaka / penolong tanggal / waktu untuk membantu menjaga Anda dari menciptakan kembali roda.
Misalnya CodeIgniter memiliki timespan()fungsi. Cukup masukkan dua cap waktu Unix dan secara otomatis akan menghasilkan hasil seperti ini:
sepertinya tidak berfungsi. Saya mendapatkan kencan di awal era timestamp.
Sirber
Penting untuk dipahami bahwa Anda perlu melakukan $my_t["year"] -= 1970untuk mendapatkan jumlah tahun yang benar. Anda juga perlu mengurangi perbedaan jam Anda dari GMT untuk mendapatkan jam yang tepat. Anda perlu mengurangi 1 dari bulan dan tanggal juga.
Salman A
6
// 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;}
Apakah "strtotime ('+ 1 tahun', $ date1)" memperhitungkan tahun kabisat?
Peter Mortensen
6
Ini adalah fungsi saya. Diperlukan PHP> = 5.3.4. Ini menggunakan kelas DateTime. Sangat cepat, cepat dan dapat melakukan perbedaan antara dua tanggal atau bahkan yang disebut "waktu sejak".
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 maintenantif(empty($To)=== TRUE){
$To = time();}# On va s'assurer que $From est numériqueif(is_int($From)=== FALSE){
$From = strtotime($From);};# On va s'assurer que $To est numériqueif(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 =newDateTime(@date('Y-m-d H:i:s', $From),newDateTimeZone('GMT'));
$To =newDateTime(@date('Y-m-d H:i:s', $To),newDateTimeZone('GMT'));# On va calculer la différence entre $From et $Toif(($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 maintenantif($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;}}
Ini akan mencoba mendeteksi apakah cap waktu diberikan atau tidak, dan juga akan mengembalikan tanggal / waktu mendatang sebagai nilai negatif:
<?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 =newDateTime(date('Y-m-d H:i:s', $$start_time_var));
$now =newDateTime(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;}elseif($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;}
"jika" tanggal disimpan dalam MySQL, saya merasa lebih mudah untuk melakukan perhitungan perbedaan pada tingkat basis data ... Kemudian berdasarkan Hari, Jam, Min, Keluaran detik, hasil parsing dan tampilan yang sesuai ...
Saya menemukan artikel Anda di halaman berikut, yang berisi sejumlah referensi untuk perhitungan waktu tanggal PHP .
Hitung perbedaan antara dua Tanggal (dan waktu) menggunakan PHP. Halaman berikut menyediakan berbagai metode yang berbeda (total 7) untuk melakukan perhitungan tanggal / waktu menggunakan PHP, untuk menentukan perbedaan waktu (jam, jam), hari, bulan atau tahun antara dua tanggal.
Anda juga dapat menggunakan kode berikut untuk mengembalikan perbedaan tanggal dengan pecahan bulat hingga $ date1 = $ duedate; // berikan tanggal jatuh tempo echo $ date2 = date ("Ymd"); // tanggal saat ini $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ datediff = ceil (($ seconds_diff / 3600) / 24); // kembali dalam beberapa hari
Jika Anda menggunakan metode lantai bukan php ceil itu akan mengembalikan Anda fraksi bulat turun. Silakan periksa perbedaannya di sini, beberapa kali jika zona waktu server pementasan Anda berbeda maka zona waktu situs langsung dalam hal ini Anda mungkin mendapatkan hasil yang berbeda sehingga ubah kondisinya.
Untuk versi php> = 5.3: Buat dua objek tanggal dan kemudian gunakan date_diff()fungsi. Ini akan mengembalikan objek DateInterval php . lihat dokumentasi
Saya memiliki masalah yang sama dengan PHP 5.2 dan menyelesaikannya dengan MySQL. Mungkin tidak persis seperti yang Anda cari, tetapi ini akan melakukan trik dan mengembalikan jumlah hari:
Karena semua orang memposting sampel kode, ini adalah versi lain.
Saya ingin fungsi untuk menampilkan perbedaan dari detik ke tahun (hanya satu unit). Untuk periode lebih dari 1 hari, saya ingin rollover pada tengah malam (jam 10 pagi hari Senin mulai jam 9 pagi hari Rabu adalah 2 hari yang lalu, bukan 1). Dan untuk periode lebih dari sebulan, saya ingin rollover berada pada hari yang sama dalam sebulan (termasuk untuk 30/31 hari bulan & tahun kabisat).
Inilah yang saya pikirkan:
/**
* 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';}
Jawaban ini sama salahnya dengan jawaban khaldonno. Diasumsikan (kasus 10) bahwa satu tahun memiliki 365 hari (setiap tahun keempat memiliki 366 hari (kecuali untuk aturan 100 tahun / 400 tahun untuk kalender Gregorian)), dan satu bulan memiliki 30 hari (sekitar 30,42 hari) dalam tahun-tahun non-kabisat). Bahkan dengan konstanta yang lebih baik, itu hanya benar secara rata-rata, belum tentu benar untuk dua tanggal tertentu.
Peter Mortensen
3
Sangat sederhana:
<?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>";?>
Ini menjalankan dua loop; yang pertama berkaitan dengan interval relatif (tahun dan bulan) melalui brute-forcing, dan yang kedua menghitung interval absolut tambahan dengan aritmatika sederhana (jadi lebih cepat):
Jawaban:
Anda dapat menggunakan strtotime () untuk mengonversi dua tanggal menjadi waktu unix dan kemudian menghitung jumlah detik di antaranya. Dari sini agak mudah untuk menghitung periode waktu yang berbeda.
Sunting: Jelas cara yang disukai untuk melakukan ini seperti dijelaskan oleh jurka di bawah ini. Kode saya umumnya hanya disarankan jika Anda tidak memiliki PHP 5.3 atau lebih baik.
Beberapa orang di komentar telah menunjukkan bahwa kode di atas hanyalah perkiraan. Saya masih percaya bahwa untuk sebagian besar tujuan itu baik-baik saja, karena penggunaan rentang lebih untuk memberikan rasa berapa banyak waktu telah berlalu atau tetap daripada memberikan presisi - jika Anda ingin melakukan itu, cukup tampilkan tanggal.
Terlepas dari semua itu, saya telah memutuskan untuk menangani keluhan. Jika Anda benar-benar membutuhkan kisaran yang tepat tetapi belum mendapatkan akses ke PHP 5.3, gunakan kode di bawah ini (ini juga bisa digunakan di PHP 4). Ini adalah port langsung dari kode yang digunakan PHP secara internal untuk menghitung rentang, dengan pengecualian bahwa itu tidak memperhitungkan waktu musim panas. Itu berarti paling tidak satu jam, tapi kecuali itu harus benar.
sumber
&
ke tanda tangan.Saya menyarankan untuk menggunakan objek DateTime dan DateInterval.
baca selengkapnya php DateTime :: diff manual
Dari manual:
sumber
$date2->format('U') - $date1->format('U')
.Tindakan terbaik adalah menggunakan objek PHP
DateTime
(danDateInterval
). Setiap tanggal dienkapsulasi dalam suatuDateTime
objek, dan kemudian perbedaan antara keduanya dapat dibuat:The
DateTime
objek akan menerima format apapunstrtotime()
akan. Jika diperlukan format tanggal yang lebih spesifik,DateTime::createFromFormat()
dapat digunakan untuk membuatDateTime
objek.Setelah kedua objek dipakai, Anda mengurangi satu dari yang lain dengan
DateTime::diff()
.$difference
sekarang memegangDateInterval
objek dengan informasi perbedaan. Avar_dump()
terlihat seperti ini:Untuk memformat
DateInterval
objek, kita perlu memeriksa setiap nilai dan mengecualikannya jika 0:Yang tersisa sekarang adalah memanggil fungsi kita pada
$difference
DateInterval
objek:Dan kami mendapatkan hasil yang benar:
Kode lengkap yang digunakan untuk mencapai tujuan:
sumber
DateTime()
bukan fungsi, itu objek, dan sudah ada sejak PHP 5.2. Pastikan server Anda mendukungnya.Lihat Jam dan Minuts dan Detik ..
sumber
Lihatlah tautan berikut. Ini jawaban terbaik yang saya temukan sejauh ini .. :)
http://www.bizinfosys.com/php/date-difference.html
sumber
Saya memilih jurka 's jawaban seperti itulah favorit saya, tapi saya memiliki versi pre-php.5.3 ...
Saya menemukan diri saya mengerjakan masalah yang sama - yaitu bagaimana saya sampai pada pertanyaan ini - tetapi hanya perlu perbedaan dalam jam. Tapi fungsi saya menyelesaikan yang satu ini dengan cukup baik dan saya tidak punya tempat di perpustakaan saya sendiri untuk menyimpannya di tempat yang tidak akan hilang dan dilupakan, jadi ... semoga ini berguna bagi seseorang.
Dan tesnya:
Dan hasilnya:
Saya mendapatkan ide asli dari sini , yang saya modifikasi untuk penggunaan saya (dan saya harap modifikasi saya akan ditampilkan di halaman itu juga).
Anda dapat dengan mudah menghapus interval yang tidak Anda inginkan (katakan "minggu") dengan menghapusnya dari
$aIntervals
array, atau mungkin menambahkan$aExclude
parameter, atau cukup filter keluar ketika Anda menghasilkan string.sumber
week
indeks$aIntervals
(karenaDateDiff
tidak pernah menggunakan itu).sumber
Saya tidak tahu apakah Anda menggunakan kerangka kerja PHP atau tidak, tetapi banyak kerangka kerja PHP memiliki pustaka / penolong tanggal / waktu untuk membantu menjaga Anda dari menciptakan kembali roda.
Misalnya CodeIgniter memiliki
timespan()
fungsi. Cukup masukkan dua cap waktu Unix dan secara otomatis akan menghasilkan hasil seperti ini:http://codeigniter.com/user_guide/helpers/date_helper.html
sumber
Gunakan contoh:
Keluaran:
Fungsi:
sumber
Saya punya beberapa logika sederhana untuk itu:
sumber
Anda dapat menggunakan
fungsi yang mengembalikan array yang mengandung semua elemen dari tanggal / waktu yang disediakan:
Jika tanggal mulai dan berakhir Anda dalam format string maka gunakan
sebelum kode di atas
sumber
$my_t["year"] -= 1970
untuk mendapatkan jumlah tahun yang benar. Anda juga perlu mengurangi perbedaan jam Anda dari GMT untuk mendapatkan jam yang tepat. Anda perlu mengurangi 1 dari bulan dan tanggal juga.sumber
Ini adalah fungsi saya. Diperlukan PHP> = 5.3.4. Ini menggunakan kelas DateTime. Sangat cepat, cepat dan dapat melakukan perbedaan antara dua tanggal atau bahkan yang disebut "waktu sejak".
sumber
Saya lebih suka menggunakan
date_create
dandate_diff
objek.Kode:
Keluaran:
Untuk info lebih lanjut baca manual PHP
date_diff
sumber
Ini akan mencoba mendeteksi apakah cap waktu diberikan atau tidak, dan juga akan mengembalikan tanggal / waktu mendatang sebagai nilai negatif:
Contoh penggunaan:
Atau:
sumber
"jika" tanggal disimpan dalam MySQL, saya merasa lebih mudah untuk melakukan perhitungan perbedaan pada tingkat basis data ... Kemudian berdasarkan Hari, Jam, Min, Keluaran detik, hasil parsing dan tampilan yang sesuai ...
sumber
Saya menemukan artikel Anda di halaman berikut, yang berisi sejumlah referensi untuk perhitungan waktu tanggal PHP .
Hitung perbedaan antara dua Tanggal (dan waktu) menggunakan PHP. Halaman berikut menyediakan berbagai metode yang berbeda (total 7) untuk melakukan perhitungan tanggal / waktu menggunakan PHP, untuk menentukan perbedaan waktu (jam, jam), hari, bulan atau tahun antara dua tanggal.
Lihat Waktu Tanggal PHP - 7 Metode untuk Menghitung Perbedaan antara 2 tanggal .
sumber
Anda juga dapat menggunakan kode berikut untuk mengembalikan perbedaan tanggal dengan pecahan bulat hingga $ date1 = $ duedate; // berikan tanggal jatuh tempo echo $ date2 = date ("Ymd"); // tanggal saat ini $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ datediff = ceil (($ seconds_diff / 3600) / 24); // kembali dalam beberapa hari
Jika Anda menggunakan metode lantai bukan php ceil itu akan mengembalikan Anda fraksi bulat turun. Silakan periksa perbedaannya di sini, beberapa kali jika zona waktu server pementasan Anda berbeda maka zona waktu situs langsung dalam hal ini Anda mungkin mendapatkan hasil yang berbeda sehingga ubah kondisinya.
sumber
sumber
Anda selalu dapat menggunakan fungsi berikut yang dapat mengembalikan usia dalam tahun dan bulan (mis. 1 Tahun 4 Bulan)
atau jika Anda ingin usia dihitung pada tanggal saat ini, Anda dapat menggunakan
sumber
Untuk versi php> = 5.3: Buat dua objek tanggal dan kemudian gunakan
date_diff()
fungsi. Ini akan mengembalikan objek DateInterval php . lihat dokumentasisumber
Ini adalah kode yang bisa dijalankan
sumber
Saya memiliki masalah yang sama dengan PHP 5.2 dan menyelesaikannya dengan MySQL. Mungkin tidak persis seperti yang Anda cari, tetapi ini akan melakukan trik dan mengembalikan jumlah hari:
Info lebih lanjut di sini http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
sumber
Karena semua orang memposting sampel kode, ini adalah versi lain.
Saya ingin fungsi untuk menampilkan perbedaan dari detik ke tahun (hanya satu unit). Untuk periode lebih dari 1 hari, saya ingin rollover pada tengah malam (jam 10 pagi hari Senin mulai jam 9 pagi hari Rabu adalah 2 hari yang lalu, bukan 1). Dan untuk periode lebih dari sebulan, saya ingin rollover berada pada hari yang sama dalam sebulan (termasuk untuk 30/31 hari bulan & tahun kabisat).
Inilah yang saya pikirkan:
sumber
Beberapa waktu yang lalu saya menulis sebuah
format_date
fungsi karena ini memberikan banyak pilihan tentang bagaimana Anda menginginkan kencan Anda :sumber
Sangat sederhana:
Silakan cek tautan berikut untuk detail:
PHP: date_diff - Manual
Perhatikan bahwa ini untuk PHP 5.3.0 atau lebih tinggi.
sumber
Fungsi yang mudah
Gunakan seperti
echo time_difference ($time_1, $time_2, "day");
Akan kembali seperti
2 years 8 months 2 days
sumber
Coba jawaban yang sangat sederhana ini menggunakan date_diff () , ini diuji.
outputnya adalah:
sumber
Saya menggunakan fungsi berikut yang saya tulis, ketika PHP 5.3 (masing-masing date_diff ()) tidak tersedia:
sumber
DateInterval
hebat tetapi memiliki beberapa peringatan:Untuk mengatasinya, saya memberi kode berikut (ditingkatkan dari jawaban @ enobrev ):
Ini menjalankan dua loop; yang pertama berkaitan dengan interval relatif (tahun dan bulan) melalui brute-forcing, dan yang kedua menghitung interval absolut tambahan dengan aritmatika sederhana (jadi lebih cepat):
sumber