"1", "1"=>"0", "2"=>"-1", "3"=>"-2", "4"=>"-3", "5"=>"-4", "6"=>"-5" ); // 指示された年月日の月1日の曜日を求める $Stat = CalcDate::GetWeek( "$DmyDate[0]/$DmyDate[1]/01", 1, $Week ); if( $Stat == False ) return False; // 指示された年月日が何週目に相当するかを算出する $Weekly = 0; $Calc = $ChgArray[$Week]; while( 1 ) { $Weekly++; if( $Calc <= $DmyDate[2] && $DmyDate[2] <= ($Calc+6) ) break; $Calc += 7; } return True; } /* // ■ 年/月/日〜年/月/日までの日付範囲を計算する // function StartToEndPerDay( $StartDate, $EndDate, &$OutDate ) { $Stat = True; // ステータス $Date = array(); // 一時作業配列 $SDate = array(); // 分解後始点日付 $EDate = array(); // 分解後始点日付 $CalcDate = array(); // 日付範囲査定用 $NextYear = ""; // 計算年 $NextMonth = ""; // 計算月 $LastDay = 0; // 計算日付の末日 $ii = 0; // 一時作業変数 $Year = ""; // 一時作業変数 $Month = ""; // 一時作業変数 // 日付範囲が未指定の場合はエラーとする if( $StartDate == "" || $EndDate == "" ) return False; // 始点,終点日付を調整する $Stat = CalcDate::AdjectDate( $StartDate, $SDate ); if( $Stat == False ) return False; $Stat = CalcDate::AdjectDate( $EndDate, $EDate ); if( $Stat == False ) return False; // 日付の範囲チェックを行う $CalcDate[0] = $SDate[0].$SDate[1].$SDate[2]; $CalcDate[1] = $EDate[0].$EDate[1].$EDate[2]; if( $CalcDate[0] > $CalcDate[1] ) return False; $CalcDate[0] = $SDate[0]."/".$SDate[1]; $CalcDate[1] = $EDate[0]."/".$EDate[1]; $NextYear = $SDate[0]; $NextMonth = $SDate[1]; while( 1 ) { $LastDay = 0; $Year = ""; $Month = ""; $Date = array(); // 計算対象年/月の末日を求める $Stat = CalcDate::GetLastDate( "$NextYear/$NextMonth", $LastDay ); if( $Stat == False ) return False; for( $ii=1; $ii<=$LastDay; $ii++ ) { // 始点日付に満たない場合は無視 if( (int)$SDate[2] > $ii && (int)$SDate[0] == $NextYear && (int)$SDate[1] == (int)$NextMonth ) continue; // 日付範囲を作成 if( strlen( $ii ) != 2 ) { $CalcDate[3] = "0".$ii; } else { $CalcDate[3] = $ii; } $OutDate[] = $NextYear."/".$NextMonth."/".$CalcDate[3]; // 終点日付と等しくなった場合は終了 if( $CalcDate[0]."/".$CalcDate[3] == $CalcDate[1]."/".$EDate[2] ) break 2; } // 一ヶ月後の年/月を求める $Stat = CalcDate::GetPointMonth( "$NextYear/$NextMonth", 1, &$Date ); if( $Stat == False ) return False; $NextYear = $Date[0]; $NextMonth = $Date[1]; $CalcDate[0] = $NextYear."/".$NextMonth; } return True; } */ // ■ 年/月〜年/月までの年月範囲を計算する // function StartToEndPerMon( $StartDate, $EndDate, &$OutDate ) { $Stat = True; // ステータス $SDate = array(); // 分解後始点日付 $EDate = array(); // 分解後始点日付 $CalcDate = array(); // 日付範囲査定用 $Month = ""; // 一時作業変数 $MatchFlag = 0; // 月名一致判断フラグ $ii = 0; // 一時作業変数 $ArrayDay = array( "01","02","03","04","05","06","07","08","09","10","11","12" ); // 日付範囲が未指定の場合はエラーとする if( $StartDate == "" || $EndDate == "" ) return False; // 始点,終点日付を調整する $Stat = CalcDate::AdjectDate( $StartDate, $SDate ); if( $Stat == False ) return False; $Stat = CalcDate::AdjectDate( $EndDate, $EDate ); if( $Stat == False ) return False; // 日付の範囲チェックを行う $CalcDate[0] = $SDate[0].$SDate[1]; $CalcDate[1] = $EDate[0].$EDate[1]; if( $CalcDate[0] > $CalcDate[1] ) return False; for( $ii=$SDate[0]; $ii<=$EDate[0]; $ii++ ) { foreach ( $ArrayDay as $Month ) { if( (int)$SDate[1] == $Month && (int)$SDate[0] == $ii ) { $MatchFlag = 1; } if( $MatchFlag == 1 ) $OutDate[] = $ii."/".$Month; if( $EDate[1] == $Month && $EDate[0] == $ii ) break; } } return True; } // ■ 年/月〜年/月までの年月範囲を計算する(RANK_ID用) // // function StartToEndPerRankID( $StartDate, $EndDate, &$OutDate, &$rank_id, &$sub_rank_id ) { function StartToEndPerRankID( $StartDate, $EndDate ) { $Stat = True; // ステータス $SDate = array(); // 分解後始点日付 $EDate = array(); // 分解後始点日付 $CalcDate = array(); // 日付範囲査定用 $Month = ""; // 一時作業変数 $MatchFlag = 0; // 月名一致判断フラグ $ii = 0; // 一時作業変数 $ArrayDay = array( "01","02","03","04","05","06","07","08","09","10","11","12" ); // 日付範囲が未指定の場合はエラーとする if( $StartDate == "" || $EndDate == "" ) return False; // 始点,終点日付を調整する $Stat = CalcDate::AdjectDate( $StartDate, $SDate ); if( $Stat == False ) return False; $Stat = CalcDate::AdjectDate( $EndDate, $EDate ); if( $Stat == False ) return False; // 日付の範囲チェックを行う $CalcDate[0] = $SDate[0].$SDate[1]; $CalcDate[1] = $EDate[0].$EDate[1]; if( $CalcDate[0] > $CalcDate[1] ) return False; // カウンター初期化 $cnt=0; $tmp=0; for( $ii=$SDate[0]; $ii<=$EDate[0]; $ii++ ) { foreach ( $ArrayDay as $Month ) { if( (int)$SDate[1] == $Month && (int)$SDate[0] == $ii ) { $MatchFlag = 1; } if( $MatchFlag == 1 ) { $OutDate[] = $ii."/".$Month; if ( $cnt < 12 ){ $rank_id[] = $cnt; $sub_rank_id[] = 0; } else { $rank_id[] = 12; if( $tmp <= 2 ){ $sub_rank_id[] = $tmp; $tmp++; } else { $sub_rank_id[] = 0; $tmp = 1; } } $cnt++; } if( $EDate[1] == $Month && $EDate[0] == $ii ) break; } } /* print "
";
print_r($rank_id);
print_r($sub_rank_id);
print "
"; */ $ret_array['rank_id'] = $rank_id[count($rank_id)-1]; $ret_array['sub_rank_id'] = $sub_rank_id[count($rank_id)-1]; return $ret_array; } // ■ GMT 時刻を日本時間に変換する // function ChgJapanTime( $OrgDate, &$ChgDate ) { $Date = ""; // 変換元GMT 日付 $Time = ""; // 変換元GMT 時間 $OriginDate = array(); // 変換元GMT 日付(配列) $OriginTime = array(); // 変換元GMT 時間(配列) // 変換元GMT 日付が未指定の場合はエラーとする if( $OrgDate == "" ) return False; // 変換元GMT 日付を分解する list( $Date, $Time ) = explode( " ", $OrgDate ); $OriginDate = explode( "-", $Date ); $OriginTime = explode( ":", $Time ); // 日本時間に変換する if( $OriginTime[0] == "00" ) $OriginTime[0] = "24"; $OriginTime[0] = $OriginTime[0]+9; $ChgDate = date( "Y-m-d H:i:s", mktime( $OriginTime[0], $OriginTime[1], $OriginTime[2], $OriginDate[1], $OriginDate[2], $OriginDate[0] ) ); return True; } // ■ ×年×月×日の曜日を計算する // function GetWeek( $TargetDate, $Option, &$Week ) { $Stat = True; // ステータス $Date = array(); // 一時作業配列 $ArrayWeek = array( "日", "月", "火", "水", "木", "金", "土" ); // 計算対象年月日,または出力表記オプションが未指定の場合はエラーとする if( $TargetDate == "" || $Option == "" ) return False; // 対象日付を調整する $Stat = CalcDate::AdjectDate( $TargetDate, $Date ); if( $Stat == False ) return False; // ×年×月×日の曜日を求める $Week = date( 'w', mktime( 0, 0, 0, (int)$Date[1], (int)$Date[2], (int)$Date[0] ) ); // オプション毎に出力表記を決定 if( $Option == 1 || $Option == "" ) $Week = $ArrayWeek[$Week]; return True; } // ■ ×年×月の末日を計算する // function GetLastDate( $TargetDate, &$LastDay ) { $Stat = True; // ステータス $Date = array(); // 一時作業配列 $ArrayDay = array(); // 一時作業配列 // 現行西暦年,現行月が未指定の場合はエラーとする if( $TargetDate == "" ) return False; // 対象日付を分解する $Stat = CalcDate::AdjectDate( $TargetDate, $Date ); if( $Stat == False ) return False; // ×年×月の末日を求める $ArrayDay = array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); $LastDay = $ArrayDay[(int)$Date[1] - 1] + ( (int)$Date[1] == 2 and $Date[0] % 4 == 0 and ( $Date[0] % 400 == 0 or $Date[0] % 100 != 0 ) ); if( strlen( $LastDay ) != 2 ) $LastDay = "0".$LastDay; return True; } // ■ 日付の大小比較を行う // function CompDate( $CompDate01, $CompDate02, &$Result ) { $Stat = True; // ステータス $Day01 = array(); // 入力日1格納変数 $Day02 = array(); // 入力日2格納変数 // 入力年月日が未取得の場合はエラーとする if( $CompDate01 == "" || $CompDate02 == "" ) return False; // 比較日付を調整する $Stat = CalcDate::AdjectDate( $CompDate01, $Date01 ); if( $Stat == False ) return False; $Stat = CalcDate::AdjectDate( $CompDate02, $Date02 ); if( $Stat == False ) return False; $CompString01 = $Date01[0].$Date01[1].$Date01[2]; $CompString02 = $Date02[0].$Date02[1].$Date02[2]; if( $CompString01 < $CompString02 ) $Result = 1; if( $CompString01 > $CompString02 ) $Result = 2; if( $CompString01 == $CompString02 ) $Result = 3; return True; } // ■ ×年×月の×ヶ月後の年月を計算する // function GetPointMonth( $TargetDate, $PointMonth, &$ResultDate ) { $Stat = True; // ステータス $Date = array(); // 分解後日付 $Number = 0; // 一時作業変数 // 現行西暦年,現行月,現行日,差分月数が未指定の場合はエラーとする if( $TargetDate == "" || $PointMonth == "" ) return False; // 対象日付を調整する $Stat = CalcDate::AdjectDate( $TargetDate, $Date ); if( $Stat == False ) return False; $Number = (int)$Date[0] * 12 + (int)$Date[1]; $Number = $Number + $PointMonth; $ResultDate[0] = (int)( $Number / 12 ); $ResultDate[1] = $Number % 12; if( $ResultDate[1] == 0 ) { $ResultDate[0]--; $ResultDate[1] = 12; } if( strlen( $ResultDate[1] ) != 2 ) $ResultDate[1] = "0".$ResultDate[1]; return True; } // ■ ×年×月×日の×日後の年月日を計算する // function GetPointDay( $TargetDate, $PointDay, &$ResultDate ) { $Stat = True; // ステータス $Date = array(); // 分解後日付 $PointFlag = ""; // 判断フラグ $UNIXTime = ""; // UNIX標準時間 // 現行西暦年,現行月,差分日数が未指定の場合はエラーとする if( $TargetDate == "" || $PointDay == "" ) return False; // 始点,終点日付を調整する $Stat = CalcDate::AdjectDate( $TargetDate, $Date ); if( $Stat == False ) return False; $Date[2] = $Date[2] + $PointDay; $UNIXTime = mktime( 0, 0, 0, $Date[1], $Date[2], $Date[0] ); $ResultDate[0] = date( 'Y', $UNIXTime ); $ResultDate[1] = date( 'n', $UNIXTime ); $ResultDate[2] = date( 'j', $UNIXTime ); if( strlen( $ResultDate[1] ) != 2 ) $ResultDate[1] = "0".$ResultDate[1]; if( strlen( $ResultDate[2] ) != 2 ) $ResultDate[2] = "0".$ResultDate[2]; return True; } // ■ 指示された時間【 hh:mm 】の合計時間を算出する // function CalcPlusTime01( $Time01, $Time02, &$Result ) { $Stat = True; // ステータス $First = 0; // 整数部 $Second = 0; // 余り部 $Time = 0; // 一時作業変数 $CalcTime01 = array(); // 一時作業配列 $CalcTime02 = array(); // 一時作業配列 $ResultTime = ""; // 検索結果 // 計算対象時間が未指定の場合はエラーとする if( $Time01 == "" || $Time02 == "" ) return False; $CalcTime01 = explode( ":", $Time01 ); $CalcTime02 = explode( ":", $Time02 ); // 単位を計算用に1桁にする if( strlen( $CalcTime01[0] ) == 2 && substr( $CalcTime01[0], 0, 1 ) == "0" ) { $CalcTime01[0] = substr( $CalcTime01[0], 1, 1 ); } if( strlen( $CalcTime01[1] ) == 2 && substr( $CalcTime01[1], 0, 1 ) == "0" ) { $CalcTime01[1] = substr( $CalcTime01[1], 1, 1 ); } if( strlen( $CalcTime02[0] ) == 2 && substr( $CalcTime02[0], 0, 1 ) == "0" ) { $CalcTime02[0] = substr( $CalcTime02[0], 1, 1 ); } if( strlen( $CalcTime02[1] ) == 2 && substr( $CalcTime02[1], 0, 1 ) == "0" ) { $CalcTime02[1] = substr( $CalcTime02[1], 1, 1 ); } // 【 分 】部を計算 $Time = $CalcTime01[1]+$CalcTime02[1]; $First = floor( $Time/60 ); $Second = ( $Time%60 ); $ResultTime[1] = $Second; // 【 時間 】部を計算 $Time = $CalcTime01[0]+$CalcTime02[0]; $Time = $Time+$First; $First = floor( $Time/24 ); $Second = ( $Time%24 ); $ResultTime[0] = $Second; $ResultTime[0] = $Second+($First*24); // 単位を表示用に2桁にする if( strlen( $ResultTime[0] ) == 1 ) { $ResultTime[0] = "0".$ResultTime[0]; } if( strlen( $ResultTime[1] ) == 1 ) { $ResultTime[1] = "0".$ResultTime[1]; } $Result = $ResultTime[0].":".$ResultTime[1]; return True; } // ■ 指示された時間【 dd:hh:mm 】の合計時間を算出する // function CalcPlusTime02( $Time01, $Time02, &$Result ) { $Stat = True; // ステータス $First = 0; // 整数部 $Second = 0; // 余り部 $Time = 0; // 一時作業変数 $CalcTime01 = array(); // 一時作業配列 $CalcTime02 = array(); // 一時作業配列 $ResultTime = ""; // 検索結果 // 計算対象時間が未指定の場合はエラーとする if( $Time01 == "" || $Time02 == "" ) return False; $CalcTime01 = explode( ":", $Time01 ); $CalcTime02 = explode( ":", $Time02 ); // 単位を計算用に1桁にする if( strlen( $CalcTime01[0] ) == 2 && substr( $CalcTime01[0], 0, 1 ) == "0" ) { $CalcTime01[0] = substr( $CalcTime01[0], 1, 1 ); } if( strlen( $CalcTime01[1] ) == 2 && substr( $CalcTime01[1], 0, 1 ) == "0" ) { $CalcTime01[1] = substr( $CalcTime01[1], 1, 1 ); } if( strlen( $CalcTime01[2] ) == 2 && substr( $CalcTime01[2], 0, 1 ) == "0" ) { $CalcTime01[2] = substr( $CalcTime01[2], 1, 1 ); } if( strlen( $CalcTime02[0] ) == 2 && substr( $CalcTime02[0], 0, 1 ) == "0" ) { $CalcTime02[0] = substr( $CalcTime02[0], 1, 1 ); } if( strlen( $CalcTime02[1] ) == 2 && substr( $CalcTime02[1], 0, 1 ) == "0" ) { $CalcTime02[1] = substr( $CalcTime02[1], 1, 1 ); } if( strlen( $CalcTime02[2] ) == 2 && substr( $CalcTime02[2], 0, 1 ) == "0" ) { $CalcTime02[2] = substr( $CalcTime02[2], 1, 1 ); } // 【 分 】部を計算 $Time = $CalcTime01[2]+$CalcTime02[2]; $First = floor( $Time/60 ); $Second = ( $Time%60 ); $ResultTime[2] = $Second; // 【 時間 】部を計算 $Time = $CalcTime01[1]+$CalcTime02[1]; $Time = $Time+$First; $First = floor( $Time/24 ); $Second = ( $Time%24 ); $ResultTime[1] = $Second; // 【 日にち 】部を計算 $Time = $CalcTime01[0]+$CalcTime02[0]; $Time = $Time+$First; $ResultTime[0] = $Time; // 単位を表示用に2桁にする if( strlen( $ResultTime[0] ) == 1 ) { $ResultTime[0] = "0".$ResultTime[0]; } if( strlen( $ResultTime[1] ) == 1 ) { $ResultTime[1] = "0".$ResultTime[1]; } if( strlen( $ResultTime[2] ) == 1 ) { $ResultTime[2] = "0".$ResultTime[2]; } $Result = $ResultTime[0].":".$ResultTime[1].":".$ResultTime[2]; return True; } // □ スラッシュ区切りの日付の有効チェックを行い,年/月/日に分解後,月/日 // 桁の調整を行う // function AdjectDate( $Date, &$DivDate ) { $Stat = True; // ステータス $LastDay = ""; // 末日格納 $EndDay = array(); // 毎月最終日格納 // 日付を分割する $DivDate = explode( "/", $Date ); // 半角数字チェック,及び範囲チェックを行う if( $DivDate[0] != "" && ereg( "^[12][0-9][0-9][0-9]$", $DivDate[0] ) == False ) { return False; } else if( $DivDate[1] != "" && ereg( "^0?[1-9]$|^1[0-2]$", $DivDate[1] ) == False ) { return False; } else if( $DivDate[2] != "" && ereg( "^0?[1-9]$|^[12][0-9]$|^3[01]$", $DivDate[2] ) == False ) { return False; } // $DivDate[0] 年 $DivDate[1] 月の末日を求める $EndDay = array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); $LastDay = $EndDay[$DivDate[1] - 1]; $LastDay += ( $DivDate[1] == 2 and $DivDate[0] % 4 == 0 and ( $DivDate[0] % 400 == 0 or $DivDate[0] % 100 != 0 ) ); // 末日チェックを行う if( $DivDate[2] != "" ) { if( $DivDate[2] > $LastDay ) return False; } // 桁数調整 if( strlen( $DivDate[1] ) != 2 ) $DivDate[1] = "0".$DivDate[1]; if( $DivDate[2] != "" ) { if( strlen( $DivDate[2] ) != 2 ) $DivDate[2] = "0".$DivDate[2]; } return True; } //******************************************************************************** // RANK_ID, SUB_RANK_IDの取得 //******************************************************************************** function getRankID( $create_date = null ){ //今日の日付取得 $now_date = date("Y/m/d"); //日付の初期値 $StartDate = ""; $EndDate = $now_date; $OutDate = ""; $rank_id = ""; $sub_rank_id = ""; //ユーザーの登録日付取得 if($create_date == null){ if (!$this->userDB) $this->userDB =& new Yumily(); $userData = $this->userDB->getUserData(); $create_date = $userData['create_date']; $StartDate = date("Y/m/d",strtotime($create_date)); } else { $StartDate = date("Y/m/d",strtotime($create_date)); } //ランクの取得 $rank_data = CalcDate::StartToEndPerRankID( $StartDate, $EndDate ); return $rank_data; } //******************************************************************************** // RANK_ID, SUB_RANK_IDの取得 //******************************************************************************** function getNextRankID( $create_date = null ){ //翌月の取得 $tday = getdate(); $MON = $tday['mon'] + 1; $lastday = mktime (0,0,0,$MON,1, $tday['year']); $nextdate = date("Y/m/d", $lastday); //日付の初期値 $StartDate = ""; $EndDate = $nextdate; $OutDate = ""; $rank_id = ""; $sub_rank_id = ""; //ユーザーの登録日付取得 if($create_date == null){ if (!$this->userDB) $this->userDB =& new Yumily(); $userData = $this->userDB->getUserData(); $create_date = $userData['create_date']; $StartDate = date("Y/m/d",strtotime($create_date)); } else { $StartDate = date("Y/m/d",strtotime($create_date)); } //ランクの取得 $rank_data = CalcDate::StartToEndPerRankID( $StartDate, $EndDate ); return $rank_data; } } ?>