90

$start_dateとがある場合$end_date、ユーザーが指定した日付がその範囲内にあるかどうかを確認するにはどうすればよいですか?

例えば

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28'; 

現時点では日付は文字列ですが、タイムスタンプ整数に変換するのに役立ちますか?

4

10 に答える 10

130

それらをタイムスタンプに変換することは、strtotimeを使用してうまくいく方法です。

$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));
}
于 2009-06-10T16:24:37.400 に答える
53

PHP 5.3以降を使用している場合は、DateTimeクラスを使用してください。使いやすく、機能性に優れています。

DateTimeは内部的にタイムゾーンをサポートしていますが、他のソリューションはそれを処理するのはあなた次第です。

<?php    
/**
 * @param DateTime $date Date that is to be checked if it falls between $startDate and $endDate
 * @param DateTime $startDate Date should be after this date to return true
 * @param DateTime $endDate Date should be before this date to return true
 * return bool
 */
function isDateBetweenDates(DateTime $date, DateTime $startDate, DateTime $endDate) {
    return $date > $startDate && $date < $endDate;
}

$fromUser = new DateTime("2012-03-01");
$startDate = new DateTime("2012-02-01 00:00:00");
$endDate = new DateTime("2012-04-30 23:59:59");

echo isDateBetweenDates($fromUser, $startDate, $endDate);
于 2012-01-30T14:45:50.740 に答える
47

文字列が「YYYY-MM-DD」正規形式の日付として検証されるため、比較を行うためにタイムスタンプに変換する必要はありません。

このテストは動作します:

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

与えられた:

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

注: このように文字列を比較すると、(12 月 32 日) '2009-13-32' などの「無効な」日付や、奇妙にフォーマットされた文字列 '2009/3/3' が許可されます。日付またはタイムスタンプの比較。これは、文字列内の日付値がCONSISTENTおよびCANONICAL形式である場合にのみ機能します。

編集してここにメモを追加し、明白なことを詳しく説明します。

CONSISTENTとは、たとえば、比較する文字列が同じ形式でなければならないことを意味します。月は常に 2 文字、日は常に 2 文字、区切り文字は常にダッシュでなければなりません。4 文字の年、2 文字の月、2 文字の日ではない「文字列」を確実に比較することはできません。たとえば、文字列に 1 文字と 2 文字の月が混在している場合、 と比較すると予期しない結果が得'2009-9-30'られ'2009-10-11'ます。人間の目には「9」は「10」より小さいと見なされますが、文字列比較では'2009-9'より大きいと見なされます'2009-1'。ダッシュ区切り文字は必ずしも必要ではありません。文字列を同じように確実に比較できます'YYYYMMDD'フォーマット; 区切り文字がある場合は、常にそこにあり、常に同じでなければなりません。

CANONICALは、日付順にソートされる文字列になるフォーマットを意味します。つまり、文字列は最初に「年」、次に「月」、「日」の表現になります。文字列を形式で確実に比較することはできません'MM-DD-YYYY'。これは標準的ではないためです。文字列の比較は左から右に行われるため、文字列の比較では (年)をMM比較する前に (月) を比較します。YYYYこの形式で表された日付は、文字列として確実に比較できます。

【追記】

PHP タイムスタンプ変換を使用する場合は、制限に注意してください。

一部のプラットフォームでは、php は 1970-01-01 より前および/または 2038-01-19 より後のタイムスタンプ値をサポートしていません。(これが UNIX タイムスタンプ 32 ビット整数の性質です。) 以降のバージョンの pf php (5.3?) では、これに対処することになっています。

文字列からタイムスタンプへの変換時とタイムスタンプから文字列への変換時に同じタイムゾーンを使用するように注意しないと、タイムゾーンも問題になる可能性があります。

HTH

于 2009-06-10T16:25:33.543 に答える
4
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)

if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
   //..falls within range
}
于 2009-06-10T16:24:21.300 に答える
3
$start_date="17/02/2012";
$end_date="21/02/2012";
$date_from_user="19/02/2012";

function geraTimestamp($data)
{
    $partes = explode('/', $data); 
    return mktime(0, 0, 0, $partes[1], $partes[0], $partes[2]);
}


$startDatedt = geraTimestamp($start_date); 
$endDatedt = geraTimestamp($end_date);
$usrDatedt = geraTimestamp($date_from_user);

if (($usrDatedt >= $startDatedt) && ($usrDatedt <= $endDatedt))
{ 
    echo "Dentro";
}    
else
{
    echo "Fora";
}
于 2011-12-18T06:00:41.113 に答える
3

あなたが提供した形式では、ユーザーが有効な日付を与えるのに十分賢いと仮定すると、最初に日付に変換する必要はなく、それらを文字列として比較できます。

于 2009-06-10T16:25:40.503 に答える
3

両方の日付をタイムスタンプに変換してから行う

疑似コード:

if date_from_user > start_date && date_from_user < end_date
    return true
于 2009-06-10T16:23:52.377 に答える
2

これを試すことができます:

//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);
于 2014-03-25T15:34:14.970 に答える
2

それらを日付またはタイムスタンプの整数に変換してから、$date_from_user が <= $end_date および >= $start_date であることを確認します。

于 2009-06-10T16:23:03.893 に答える
0

この方法が最も簡単であることがわかりました。

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

$start_date = date_create($start_date);
$date_from_user = date_create($date_from_user);
$end_date = date_create($end_date);

$interval1 = date_diff($start_date, $date_from_user);
$interval2 = date_diff($end_date, $date_from_user);

if($interval1->invert == 0){
  if($interval2->invert == 1){

     // if it lies between start date and end date execute this code

  }
}
于 2016-06-20T11:05:24.623 に答える