PHP datetime ilgili işlemleri gerçekleştirirken

11 Cevap php

Nasıl aslında böyle bir aralıkta hafta sonları hariç kaç gün bulmak, tarih ekleme fark bulma gibi datetime işlemleri yapabilirim? Ben şahsen genelde Ben sadece daha fazla şansı demektir ki çok daha fazla kod yazmak zorunda PHP şekilde bunu yapmak için, ancak, bir yanıt almak için bir sql deyimi vermek gerekir gibi, benim postgresql dbms için bu işlemlerden bazıları geçmeye başladı hataları meydana için ...

Bir sürü kod gerektirmeyen bir şekilde datetime işlemi yapar PHP kütüphaneler var mı? Bu 'iki tarih, iki tarih arasında kaç işgünü vardır Verilen bir durumda sql yener? Bu sorguyu yaparak çözüldü SQL, ya $ pet_lang 'ya uygulamak?

SELECT  COUNT(*) AS total_days
FROM    (SELECT date '2008-8-26' + generate_series(0,
          (date '2008-9-1' - date '2008-8-26')) AS all_days) AS calendar
WHERE   EXTRACT(isodow FROM all_days) < 6;

11 Cevap

Çoğu datetime operasyonları için ben normalde unixtime dönüştürmek istiyorsunuz ve Unixtime tamsayı ekleme çıkarma vb gerçekleştirmek ederken, Zend framework Zend_Date sınıf bakmak isteyebilirsiniz.

Bu tarif işlevselliği bir yeri vardır. Zend çalışır bir "çerçeve" son derece sıra almak için bir sınıf kütüphanesi olarak fatura ve elemanlarını seçti rağmen. Biz rutin projeler içinde yer alıyor ve biz onları gerektiğinde sonra sadece bit kadar çekin ve.

ARMUT :: Tarih de bazı yararlı özelliğe sahip olabilir gibi görünüyor: http://pear.php.net/package/Date. ARMUT :: Takvim de yararlı olabilir: http://pear.php.net/package/Calendar

strtotime () yararlıdır ama bu sadece bir formatlanmış tarih / zaman dize dönüştürmek için kullanıyor değilse zaman zaman pop-up bazı tuhaf davranışları var.

"1 ay" veya "-3 gün" gibi şeyler bazen çıktıya beklediğiniz veremem.

Bir tarih eklemek için, yöntemi kullanabilirsiniz DateTime::add (Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object), itibaren php 5.3.0 edinilebilir.

İki tarih arasındaki farkı bulmak için, DateTime::diff yöntem var; ancak iki tarih arasındaki çalışma gün sayıyor için bir yöntem olarak görünmüyor.

Kolay yöntem 1 Ocak 2008 yılından bu yana saniye sayısını temsil eden, bir zaman damgası kullanmak. Damgası türüyle, gibi şeyler yapabilirsiniz ...

now = time();
tomorrow = now + 24 * 60 * 60; // 24 hours * 60 minutes * 60 seconds

Php web sayfalarında time(), date() ve mktime() için belgelerine göz atın. Bu ben en sık kullanma eğiliminde üç yöntem vardır.

Sen aritmetik todo strtotime, mktime ve date bir arada kullanabilirsiniz

Here is an example which uses a combo todo some arithmetic http://rushi.wordpress.com/2008/04/13/php-print-out-age-of-date-in-words/ I'll reproduce the code here for simplicity

if ($timestamp_diff < (60*60*24*7)) {
   echo floor($timestamp_diff/60/60/24)." Days";
} elseif ($timestamp_diff > (60*60*24*7*4)) {
   echo floor($timestamp_diff/60/60/24/7)." Weeks";
} else {
   $total_months = $months = floor($timestamp_diff/60/60/24/30);
   if($months >= 12) {
      $months = ($total_months % 12);
      $years&nbsp; = ($total_months - $months)/12;
      echo $years . " Years ";
   }
   if($months > 0)
      echo $months . " Months";
}
?>

@ Rushi I strtotime () sevmiyorum şahsen .. ben niye bilmiyorum ama ben strtotime bu '2008-09-11 09:05 'gibi bir dize geçen bir false döndüren bu sabah keşfetti ...

Ben iki tarih, iki tarih arasında kaç işgünü vardır göz önüne alındığında 'sağlanan kod örneği sorunu çözmek değil mi? SQL, ya $ pet_lang 'ya uygulamak ve genel tatil bir liste varsa ben düşünün değil ...

Eğer http://php.net/date bir göz varsa, işlemleri gerçekleştirmek için mktime () kullanarak bazı örnekler bulacaksınız.

Basit bir örnek tarih olur yarınlar ne egzersiz olacaktır. Aşağıdaki gibi () mktime olarak gün değeri, sadece 1 ekleyerek yapabilirsiniz:

$ Yarın = date ("Ymd", mktime (0, 0, 0, date ("m"), date ("d") + 1, date ("Y")));

Yani burada, sen YYYY-AA-GG içeren yarınlar tarih biçiminde bir tarih alacaksınız. '-' Sen de basitçe '+' yerine gün çıkarabilirsiniz. mktime () hayat çok daha kolay hale getirir ve tablolar ve diğer gibi zahmetli kodlama iç içe if yapmak zorunda sizi kurtarır.

Böyle iki tarih arasındaki gün sayısını alabilirsiniz:

$days = (strtotime("2008-09-10") - strtotime("2008-09-12")) / (60 * 60 * 24);

Ve sen (bu yüzden sözdizimi% 100 doğru olduğunu garanti edemeyiz php benim iş bilgisayarda yüklü değil) böyle bir işlevi şey yapabilirsiniz

function isWorkDay($date)
{
 // check if workday and return true if so
}

function numberOfWorkDays($startdate, $enddate)
{
  $workdays = 0;
  $tmp = strtotime($startdate);
  $end = strtotime($enddate);
  while($tmp <= $end)
  {
    if ( isWorkDay( date("Y-m-d",$tmp) ) ) $workdays++;
    $tmp += 60*60*24;
  }
  return $workdays;
}

Eğer strtotime sevmiyorum ve her zaman aynı formatta tarih varsa benzeri bir işlevi patlayabilir kullanabilirsiniz

list($year, $month, day) = explode("-", $date);

Ben kuvvetle ziyade tarih hesaplamaları yaparken, UNIX zaman kullanmak yerine, PHP 5.2 's DateTime objects kullanarak öneriyoruz. Eğer UNIX zaman dönmek PHP tarih işlevlerini kullandığınızda, (1970 öncesi örneğin hiçbir şey) ile çalışmak için çok sınırlı bir dizi var.

çalışma almak için gün / tatil, postgresql CTE FTW - bkz http://osssmb.wordpress.com/2009/12/02/business-days-working-days-sql-for-postgres-2/