PHP日時増減操作例【date sttotime 1日プラス、1月プラスなどの操作を実現】


この実例はPHP時間の日にち増減操作について述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
時間関数はPHPの中の日常関数で、時間のデフォルトの時期は今日、昨日、明日、先週、来週、今週の開始時間と終了時間です。今月の開始時間の終了時間。先月の開始時間の終了時間、指定日の月曜日と日曜日などの方法があります。

date_default_timezone_set('PRC'); //    
//       5 
$date1 = "2018-12-21";
echo date('Y-m-d',strtotime("$date1 +5 day")); //    :2018-12-26
//   ,    , , day  month year  
//+++   、  、   、   、    +++++++++
echo "  :",date("Y-m-d",time()),"<hr>";
echo "  :",date("Y-m-d",strtotime("-1 day")), "<hr>";
echo "  :",date("Y-m-d",strtotime("+1 day")), "<hr>";
echo "   :",date("Y-m-d",strtotime("+1 week")), "<hr>";
echo "           :",date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")), "<hr>";
echo "     :",date("Y-m-d",strtotime("next Thursday")), "<hr>";
echo "    :".date("Y-m-d",strtotime("last Monday"))."<hr>";
echo "    :".date("Y-m-d",strtotime("last month"))."<hr>";
echo "    :".date("Y-m-d",strtotime("+1 month"))."<hr>";
echo "   :".date("Y-m-d",strtotime("+10 year"))."<hr>";

実行結果:
2018-12-26今日:2018-12-21
--------------------------------------------------
昨日:2018-12-20
--------------------------------------------------
明日:2018-12-22
--------------------------------------------------
一週間後:2018-12-28
--------------------------------------------------
一週間と二日間の四時間二秒後:2018-12-30 15:46
--------------------------------------------------
来週の木曜日:2018-12-27
--------------------------------------------------
前の月曜日:2018-12-17
--------------------------------------------------
一ヶ月前:2018-11-21
--------------------------------------------------
一ヶ月後:2019-01-21
--------------------------------------------------
十年後:2028-12-21
--------------------------------------------------
php今週の開始時間と終了時間。今月の開始時間の終了時間。先月の開始時間の終了時間

date_default_timezone_set('PRC'); //    
/**
*   :                   
*   :$gdate   ,     ,  :YYYY-MM-DD
* $first              ,0    ,1    
*   :  array("    ", "    ");
*
*/
function aweek($gdate = "", $first = 0){
  if(!$gdate) $gdate = date("Y-m-d");
  $w = date("w", strtotime($gdate));//        ,     0-6
  $dn = $w ? $w - $first : 6;//      
  //      
  $st = date("Y-m-d", strtotime("$gdate -".$dn." days"));
  //      
  $en = date("Y-m-d", strtotime("$st +6 days"));
  //      
  $last_st = date('Y-m-d',strtotime("$st - 7 days"));
  //      
  $last_en = date('Y-m-d',strtotime("$st - 1 days"));
  return array($st, $en,$last_st,$last_en);//         
}
echo implode("|", aweek("", 1)).'<br />';
//echo date("Y-m-d",strtotime("time()"));
echo '     (        ):'.date('Y-m-d', time()-86400*date('w')).'<hr>';
echo '     (        ):'.date('Y-m-d', time()-86400*date('w')+(date('w')>0?86400:-6*86400)).'<hr>';
echo '     :'.date('Y-m-d', mktime(0,0,0,date('m'),1,date('Y'))).'<hr>';
echo '      :'.date('Y-m-d', mktime(0,0,0,date('m'),date('t'),date('Y'))).'<hr>';
//        
$m = date('Y-m-d', mktime(0,0,0,date('m')-1,1,date('Y')));
//       
$t = date('t',strtotime("$m"));
echo '     :'.date('Y-m-d', mktime(0,0,0,date('m')-1,1,date('Y'))).'<hr>';
echo '      :'.date('Y-m-d', mktime(0,0,0,date('m')-1,$t,date('Y'))).'<hr>';

実行結果:
2018-12-17|2018-12-23|2018-12-10|2018-12-16
今週の第一日(日曜日は一週間開始):2018-12-16
--------------------------------------------------
今週の第一日(月曜日は週開始):2018-12-17
--------------------------------------------------
今月の一日目:2018-12-01
--------------------------------------------------
今月最後の日:2018-12-31
--------------------------------------------------
先月の一日目:2018-11-01
--------------------------------------------------
先月最後の日:2018-11-30
--------------------------------------------------

//PHP          ,              
function get_week_range($week, $year){
  $timestamp = mktime(1,0,0,1,1,$year);
  $firstday = date("N",$timestamp);
  if($firstday >4){
    $firstweek = strtotime('+'.(8-$firstday).' days', $timestamp);
  }else{
    $firstweek = strtotime('-'.($firstday-1).' days', $timestamp);
  }
  $monday = strtotime('+'.($week - 1).' week', $firstweek);
  $sunday = strtotime('+6 days', $monday);
  $start = date("Y-m-d", $monday);
  $end = date("Y-m-d", $sunday);
  return array($start, $end);
}
//strtotime               BUG
//PHP          ,              
function get_week_range2($week, $year){
  $timestamp = mktime(1,0,0,1,1,$year);
  $firstday = date("N",$timestamp);
  if($firstday >4){
    $firstweek = strtotime('+'.(8-$firstday).' days', $timestamp);
  }else{
    $firstweek = strtotime('-'.($firstday-1).' days', $timestamp);
  }
  $monday = strtotime('+'.($week - 1).' week', $firstweek);
  $sunday = strtotime('+6 days', $monday);
  $start = date("Y-m-d", $monday);
  $end = date("Y-m-d", $sunday);
  return array($start, $end);
}

しかし、年越しの時に使うと問題があります。
例えば、2011年の12月31日土曜日と2012年1月1日日曜日は、月曜日と日曜日が全く違っています。
2011年12月31日の月曜日と日曜日はそれぞれ対応します。
2011-12-26
2012-01-01
しかし、2012年1月1日に貰った月曜日と日曜日はそれぞれ対応します。
2012-01-02
2012-01-04
理由は伝わり方の週は53週目ですが、2011年は53週目ですので、計算が間違っています。
週が10より大きい場合(月は10週間は無理ですので)、月が1の場合は、年1を減算します。

if(date('m',$last_week_time) == '01' and $tmp_last_week > 10){
  $last_week_year--;
}

PS:ここでまたいくつかの時間と日付に関するツールを紹介します。参考にしてください。
オンライン日付/日数計算機:
http://tools.jb51.net/jisuanqi/date_jisuanqi
オンライン日付計算機/差分日数計算機:
http://tools.jb51.net/jisuanqi/datecalc
オンライン日付の日数差計算機:
http://tools.jb51.net/jisuanqi/onlinedatejsq
Unixタイムスタンプ(timestamp)変換ツール:
http://tools.jb51.net/code/unixtime
PHPについてもっと興味のある読者は、本駅のテーマを見てもいいです。「php日付と時間の使い方のまとめ」、「PHP配列(Aray)操作テクニック大全」、「PHP基本文法入門教程」、「PHP演算と演算子の使い方のまとめ」、「php対象プログラム設計入門教程」、「php文字列(string)使い方のまとめ」、「php+mysqlデータベース操作入門教程」および「phpよくあるデータベースの操作技巧のまとめ
本論文で述べたように、皆さんのPHPプログラムの設計に役に立ちますように。