2017-11-07 17 views
0

日付に関する問題があります。私はあなたの活動が1日以上で、3未満が他の日付がX日より古い場合はPHP

をmoethingない場合は、他の

をsomethinkん

--->のような場合は、あなたの活動は1日未満であれば作る必要があります

あなたの行動が3以上の場合その他

私はこれをPHPで必要としています。私の実際のコードは:

if (strtotime(strtotime($last_log)) < strtotime('-1 day')) { 
    $prom .= "" . json_encode('last_activity') . ": " . json_encode("inactive less than 1 day") . ","; 
} else if (strtotime($last_log) > strtotime('-1 day') && strtotime($last_log) < strtotime('-3 day')) { 
    $prom .= "" . json_encode('last_activity') . ": " . json_encode("inactive more than 1 day and less than 3 days") . ","; 
} else if (strtotime($last_log) > strtotime('-3 day')) { 
    $prom .= "" . json_encode('last_activity') . ": " . json_encode("inactive more than 3") . ","; 
} 

私は本当に日付の計算を理解していないと思います。

+0

1. jsonドキュメントを手動でビルドしないでください。 'json_encode()'が何であるか想像できませんが、オブジェクト全体をビルドするためのものです。 2.相対データをファイルに入れたり、絶対データをファイルに入れたり、必要に応じて後でデコードアプリケーションに計算させたりしないでください。だから: 'json_encode(['last_activity' => $ last_log]' 'は' {"last_activity": "whatever"} 'を返し、それで終了します。 – Sammitch

+0

$ last_logの値は何ですか?そしてなぜあなたの最初の場合にstrtotimeを2回行うのですか? – Nic3500

+0

$ last_logはDBからの日時ですのでmissclick – k4znIm

答えて

0

Date_diff、この場合にははるかに簡単です:

$datetime1 = date_create(); // now 
$datetime2 = date_create($last_log); 

$interval = date_diff($datetime1, $datetime2); 

$days = $interval->format('d'); // the time between your last login and now in days 

参照:http://php.net/manual/en/function.date-diff.php

それともあなたの方法で:

if(strtotime($last_log) < strtotime('-1 day')){ 
    // it's been longer than one day 
} 
+0

はい!ありがとう、これははるかに良いと簡単です:)ありがとう! – k4znIm

+0

@ k4znlm:答えはdate_diffの使い方を示している点で良いです。しかし、私はあなたのロジックも修正する必要があることをお勧めします。あなたがそれらをしたようなifステートメントは、1日未満のすべての値が常に「1日未満の間不活性」と表示されます。 5日前に最後のログがあった場合、if(-5 <-1)はtrueを返し、最初の条件をトリガーします。しかし、 "3日間以上非アクティブ"と言うべきです。 – Nic3500

-1
$dateLog = new DateTime($last_log); // format if needed 

$tomorrow  = new DateTime("tomorrow"); 
$yesterday = new DateTime("yesterday"); 
$threeDaysAgo = new DateTime("-3 days"); 

if ($dateLog < $yesterday) { 
     // Do what you want 
} else if ($dateLog > $yesterday && $dateLog < $threeDaysAgo) { 
     // Do another thing 
} else if ($dateLog > $threeDaysAgo) { 
     // ... 
} 

ドキュメントはここにある:http://php.net/manual/en/datetime.diff.php

+0

OPはif文ロジックでも間違いを犯しました。だから、単にDateTimeに変更しても、彼が望むものは得られません。 – Nic3500

0

あなたがのstrtotimeでそれをしたい場合は、このようにそれを実行します。

date_default_timezone_set('SOMETHING FOR YOU'); 

$last_log = '-0.5 day'; 

$last_log_time = strtotime($last_log); 
$minus1day_time = strtotime('-1 day'); 
$minus3day_time = strtotime('-3 day'); 

echo $last_log_time . "<br>"; 
echo $minus1day_time . "<br>"; 
echo $minus3day_time . "<br>"; 

if ($last_log_time < $minus3day_time) 
{ 
    echo "inactive more than 3"; 
} 
elseif (($last_log_time <= $minus1day_time) && ($last_log_time >= $minus3day_time)) 
{ 
    echo "inactive more than 1 day and less than 3 days"; 
} 
elseif ($last_log_time > $minus1day_time) 
{ 
    echo "inactive less than 1"; 
} 

私はあなたのコードから変更カップルの事:

  • のstrtotime(のstrtotime())を削除します。それを2回しないでください!
  • 2番目のifでは、条件の正しい評価を保証するために括弧を追加しました。
  • ifの順序を逆にしました。最初にそれが非常に古いかどうか確認してください(< -3)。 -3と-1の間にあるかどうかを確認します。そして-1と今の間をチェックしてください。
  • < =と> =を追加しました。 =あなたのコードからケースが見つかりませんでした。したがって、last_logが== -1だった場合、それはそれまでに処理されませんでした。
  • "else if"を "elseif"に置き換えます。
  • strtotimeの再計算が無駄であるため、変数を使用しました。そして、それはコードを読みにくいIMHOにします。

次に、json_encodeコメントを適用します。

  • ユーザーの最後のログインは、常に今の前に次のようになります。ロジックが逆転した理由を説明する

  • ユーザーのlast_loginが5日前であるとすることができます。 strtotime($ last_login)はstrtotime( ' - 1 days')よりも小さいので、ifがtrueになります。しかし、それはOPが望んでいるものではありません!彼はここに、最後のログインが3日以上経過した場合を望んでいます。
  • 私たちは過去の数字を比較しているので、小さいほど、古いものを覚えています。
+0

はい、これは当てはまりますが、私はif論理に間違いがあります。私にそれを説明してくれてありがとう。私は論理的にミステイクを作ります、なぜなら、私はこのことを見ることができないからです。 date_diffを使用するほうがはるかに優れています。私は前にその機能について知りません:) – k4znIm

関連する問題