PHP獲取一段時間內的每個周幾,每月幾號,遇到特殊日子就往後延
2016年11月1日 16:18:19 星期二
主要用到的函式是 strtotime()
strtotime(`+1 Tuesday`, $timestamp) 獲取下週二, 從時間戳$timestamp開始計算, 如果$timestamp留空, 則從當天開始計算
strtotime(`+1 month`, $timestamp) 獲取下個月的x號, 還是以$timestamp開始計算的
1 /** 2 * desc 獲取每週X執行的所有日期 3 * @param string $start 開始日期, 2016-10-17 4 * @param string $end 結束日期, 2016-10-17 5 * @param int $weekDay 1~5 6 * @return array 7 */ 8 public function getWeeklyBuyDate($start, $end, $weekDay) 9 { 10 //獲取每週要執行的日期 例如: 2016-01-02 11 $start = empty($start) ? date(`Y-m-d`) : $start; 12 $startTime = strtotime($start); 13 14 $startDay = date(`N`, $startTime); 15 if ($startDay < $weekDay) { 16 $startTime = strtotime(self::$WORK_DAY[$weekDay][`en`], strtotime($start)); //本週x開始, 例如, 今天(週二)使用者設定每週四執行, 那本週四就會開始執行 17 } else { 18 $startTime = strtotime(`next `.self::$WORK_DAY[$weekDay][`en`], strtotime($start));//下一個周x開始, 今天(週二)使用者設定每週一執行, 那應該是下週一開始執行 19 } 20 21 $endTime = strtotime($end); 22 $list = []; 23 for ($i=0;;$i++) { 24 $dayOfWeek = strtotime("+{$i} week", $startTime); //每週x 25 if ($dayOfWeek > $endTime) { 26 break; 27 } 28 $list[] = date(`Y-m-d`, $dayOfWeek); 29 } 30 31 return $this->getExedate($start, $end, $list); 32 } 33 34 /** 35 * desc 獲取每月X號執行的所有日期 36 * @param string $start 開始日期, 2016-10-17 37 * @param string $end 結束日期, 2016-10-17 38 * @param int $monthDay 1~28 39 * @return array 40 */ 41 public function getMonthlyBuyDate($start, $end, $monthDay) 42 { 43 $monthDay = str_pad($monthDay, 2, `0`, STR_PAD_LEFT); //左邊補零 44 $start = empty($start) ? date(`Y-m-d`) : $start; 45 $startTime = strtotime($start); 46 $startDay = substr($start, 8, 2); 47 48 if (strcmp($startDay, $monthDay) < 0) { 49 $startMonthDayTime = strtotime(date(`Y-m-`, strtotime($start)).$monthDay); //本月開始執行, 今天(例如,26號)使用者設定每月28號執行, 那麼本月就開始執行 50 } else { 51 $startMonthDayTime = strtotime(date(`Y-m-`, strtotime(`+1 month`, $startTime)).$monthDay); //從下個月開始 52 } 53 $endTime = strtotime($end); 54 55 $list = []; 56 for ($i=0;;$i++) { 57 $dayOfMonth = strtotime("+{$i} month", $startMonthDayTime);//每月x號 58 if ($dayOfMonth > $endTime) { 59 break; 60 } 61 $list[] = date(`Y-m-d`, $dayOfMonth); 62 } 63 64 return $this->getExedate($start, $end, $list); 65 66 } 67 68 /** 69 * desc 返回順延後的執行日期列表 70 * @param string $start 開始日期, 2016-10-17 71 * @param string $end 結束日期, 2016-10-17 72 * @param array $planDate 73 * @return array 74 */ 75 public function getExedate($start, $end, $planDate) 76 { 77 //獲取所有交易日 78 $allTradeDate = $this->getTradeDate($start, $end); 79 80 //取最後一個交易日 81 $endTradeDate = end($allTradeDate); //返回格式: [`2016-11-01` => `2016-11-01`, `2016-11-02` => `2016-11-02`, ...], 有冗餘,方便程式設計 82 83 $exeDate = []; //順延後的執行日期 84 foreach ($planDate as $date) { 85 if (!empty($allTradeDate[$date])) { 86 $exeDate[$date] = $date; 87 } else { //沒找到, 需要往後順延到下一個交易日 88 $exeDate[$date] = ``; 89 90 $endTradeTime = strtotime($endTradeDate); 91 $currentTime = strtotime($date); 92 93 for ($i=$currentTime; $i<=$endTradeTime; $i+=86400) {//一天一天往後順延, 直到找到下一個交易日, 直到資料庫儲存的最後一個交易日 94 $tmpDate = date(`Y-m-d`, $i); 95 if (!empty($allTradeDate[$tmpDate])) { //找到就退出迴圈 96 $exeDate[$date] = $tmpDate; 97 break; 98 } 99 } 100 } 101 } 102 103 return $exeDate; 104 }
其中:
1 public static $WORK_DAY = [ 2 1 => [`en` => `Monday`, `cn` => `一`], 3 2 => [`en` => `Tuesday`, `cn` => `二`], 4 3 => [`en` => `Wednesday`, `cn` => `三`], 5 4 => [`en` => `Thursday`, `cn` => `四`], 6 5 => [`en` => `Friday`, `cn` => `五`] 7 ];
相關文章
- 獲取字串中數字,並計算指定時間的後幾個月是幾月幾號字串
- java獲取日期差以及幾天前和幾天後的時間Java
- python 獲取一段時間內,每個月的第一天和最後一天Python
- php 和 nginx 的幾個超時時間PHPNginx
- 分享一段PHP格式化時間戳的程式碼,可以把時間戳轉化成幾天前,幾個月前的格式PHP時間戳
- JavaScript 獲取指定時間前幾天日期JavaScript
- 網路時延的幾個概念
- 幾周內搞定Java的10個方法Java
- sql server 計算兩個時間 相差的 幾天幾時幾分幾秒SQLServer
- php 獲取時間差PHP
- Swift 3 獲取當前日期是第幾周Swift
- PHP獲取和操作配置檔案php.ini的幾個函式PHP函式
- PHP求時間間隔n天、周、月、年後的時間PHP
- 怎麼估算一段時間裡,幾條SQL所佔用的時間SQL
- mysql幾個時間函式MySql函式
- c++ 獲取當前時間周初凌晨時間戳(獲取當前時間週一凌晨時間戳)C++時間戳
- 獲取WebLogic版本號有以下幾種方式Web
- php中計算時間差的幾種方法PHP
- Solon 框架如何方便獲取每個請求的響應時間?框架
- IOS 自動化,幾種特殊情況下 UI 元素獲取的方式iOSUI
- js實現的獲取指定時間前幾天日期程式碼例項JS
- mysql 分組取每個組的前幾名的問題MySql
- bat之獲取指定幾個月前的月份資訊BAT
- javascript獲取li列表中的第幾個liJavaScript
- MDM獲取UDID的幾個技術點
- MySQL 多表分組後獲取每一組的時間最大的那條記錄MySql
- iOS時間格式化“剛剛、幾分鐘前、幾小時前”等,[包括時間戳&格式化後的時間]...iOS時間戳
- js獲取多少天以後的時間JS
- jQuery選擇器獲取前幾個元素jQuery
- Python獲取星期幾Python
- python中星號變數的幾種特殊用法Python變數
- XAML中的特殊符號幾空白字元處理符號字元
- JavaScript獲取每個月最後一天的日期JavaScript
- PHP獲取當前季度的開始時間和結束時間PHP
- asp.net 格式化顯示時間為幾個月,幾天前,幾小時前,幾分鐘前,或幾秒前ASP.NET
- php 根據給定字串時間獲取時區PHP字串
- JavaScript獲取當前li元素是第幾個JavaScript
- js獲取當前時間上一個月前的時間JS