Bir tarih belirli bir aralıkta olup olmadığını nasıl kontrol edebilirim?

7 Cevap php

Bir $start_date ve $end_date eğer kullanıcı tarafından verilen bir tarih bu aralığa düşerse, nasıl kontrol edebilirim?

örneğin

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28';

Şu anda bir tarih o zaman damgası tamsayılar onları dönüştürmek için yardımcı olacağını, dizeleri vardır?

7 Cevap

Damgaları onları dönüştürerek strtotime, örneğin kullanarak, tamam gitmek için yoludur

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28';

check_in_range($start_date, $end_date, $date_from_user);


function check_in_range($start_date, $end_date, $date_from_user)
{
  // Convert to timestamp
  $start_ts = strtotime($start_date);
  $end_ts = strtotime($end_date);
  $user_ts = strtotime($date_from_user);

  // Check that user date is between start & end
  return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}

Bu dizeleri 'YYYY-AA-GG' kurallı biçimde tarih olarak doğrulanma verilen, karşılaştırma yapmak için zaman damgası dönüştürmek için gerekli değildir.

Bu test çalışacaktır:

( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )

Verilen:

$start_date     = '2009-06-17';
$end_date       = '2009-09-05';
$date_from_user = '2009-08-28';

NOT: "geçerli olmayan" örneğin Tarihleri ​​için böyle karşılaştırma dizeleri izin yok (Aralık 32) '2009-13-32 've esrarlı biçimlendirilmiş dizeleri için '2009 / 3/3' dize karşılaştırma bir tarih veya zaman damgası karşılaştırma eşdeğer olmayacaktır böyle. Dizeleri tarih değerleri CONSISTENT olan ve CANONICAL biçiminde SADECE olursa çalışır.

EDIT bariz tertipleyerek, burada bir not eklemek için.

Ay her zaman, iki karakter olmalıdır gün her zaman iki karakter olmalı ve ayırıcı karakteri her zaman bir çizgi olmalıdır: By CONSISTENT, ben karşılaştırılan dizeleri aynı formatta olması gerektiğini, örneğin anlamına gelir. Biz güvenilir dört karakter yıl, iki karakter ay, iki karakter bir gün değil "dizeleri" karşılaştırmak olamaz. Biz bir karakter ve dizeleri iki karakter aylık bir karışımı vardı, örneğin, biz göre beklenmeyen bir sonuç almak istiyorum, '2009-9-30' için '2009-10-11'. Biz insanca "10" daha az olarak "9" görmek, ama bir dize karşılaştırması '2009-9' daha büyük olarak görürsünüz '2009-1'. Biz mutlaka bir çizgi ayırıcı karakter olması gerekmez; biz sadece güvenilir 'YYYYMMDD' formatında dizeleri karşılaştırmak olabilir; bir ayırıcı karakter varsa, o zaman orada olacağız ve hep aynı olmak zorundadır.

Tarafından CANONICAL, ben demek tarih sırasına göre sıralanır dizeler sonuçlanacak bir biçimi. Bu dize "gün" daha sonra "ay", ilk "yılın" bir temsil olacak, olduğunu. Bu kurallı değil çünkü güvenilir, 'MM-DD-YYYY' biçiminde dizeleri karşılaştırmak olamaz. O YYYY (yıl) göre daha önce dize karşılaştırma soldan sağa çalışır beri bir dize karşılaştırma MM (ay) karşılaştırmak istiyorsunuz.) Ait 'YYYY-AA-A büyük yarar DD 'dizge biçimi kurallı olduğunu; Bu biçimde temsil tarihleri ​​güvenilir dizeleri olarak mukayese edilebilir.

[EK]

Eğer php damgası dönüşüm için gitmek yaparsanız, sınırlarının farkında olmak.

Bazı platformlarda, php önceki 1970/01/01 ve / veya daha sonraki 2038/01/19 daha fazla zaman damgası değerlerini desteklemiyor. (Yani unix timestamp 32-bit tamsayı doğasında var.) Sonraki sürümleri (5.3?) Php pf o adrese gerekiyor.

Geri dize zaman damgası damgası ve dizeden dönüştürürken, aynı zaman dilimini kullanmak için dikkatli değilseniz dilimi de, bir sorun olabilir.

HTH

PHP 5.3 + varsa DateTime sınıfını kullanın. Daha kolay, daha iyi işlevselliği kullanmak için.

DateTime içten, saat dilimleri destekleyen diğer çözümlerle bu işlemek için size kalmış.

<?php
$fromUser = new DateTime("2012-03-01");

if (
  $fromUser > new DateTime("2012-02-01 00:00:00") &&
  $fromUser < new DateTime("2012-04-30 23:59:59"))
{
    return true;
}

return false;

Eğer kullanıcı size geçerli bir tarih verecek kadar akıllı olduğunu varsayarak, verdiğiniz biçiminde, önce bir tarihe dönüştürmek gerekmez, dizeleri olarak bunları karşılaştırabilirsiniz.

Yapmak o zaman damgaları hem tarih dönüştürmek

pseudocode:

if date_from_user > start_date && date_from_user < end_date
    return true

Tarih veya zaman damgası tamsayılar dönüştürmek ve sonra sadece $ date_from_user arasında check <= $ end_date ve> = $ start_date

Bu deneyebilirsiniz:

//custom date for example
$d1 = new DateTime("2012-07-08");
$d2 = new DateTime("2012-07-11");
$d3 = new DateTime("2012-07-08");
$d4 = new DateTime("2012-07-15");

//create a date period object
$interval = new DateInterval('P1D');
$daterange = iterator_to_array(new DatePeriod($d1, $interval, $d2));
$daterange1 = iterator_to_array(new DatePeriod($d3, $interval, $d4));
array_map(function($v) use ($daterange1) { if(in_array($v, $daterange1)) print "Bingo!";}, $daterange);