謹慎使用php的strtotime 函式

2022-07-18 06:15:15 字數 2431 閱讀 7308

我們在日常業務中,針對業務量,經常會採用對資料庫按時間做橫向分表,分表後的查詢往往會涉及到時間問題。例如,我們想查詢某個使用者距離當前時間1個月的訂單情況,在這個時候,我們有些會用到strtotime()函式去處理。

但是使用strtotime(),需要非常謹慎。我們先看一段**,**目的是想拿到幾個月以前的年份月份,例如今天是2023年8月1號,我想拿到2個月前的年份月份是 array("0"=>"201406", "1"=>"201407",)

1

/****

2*$mthnum 幾月以前

3* return like array('0'=>'201401','1'=>'201402'),結果不包含當前月份

4************/5

function gettimeym($mthnum)6

17while ($mthnum > 0);

1819

return

$timearr

;20 }

表面看**似乎沒有問題,但是我們做個測試,下面是測試**,測試的目的很簡單,只是想測試一下,每個月最後一天的前乙個月的日期是多少

1

<?php

2$datearr = array

(3 "2014-01-31 00:00:00 -1 month",

4 "2014-02-28 00:00:00 -1 month",

5 "2014-03-31 00:00:00 -1 month",

6 "2014-04-30 00:00:00 -1 month",

7 "2014-05-31 00:00:00 -1 month",

8 "2014-06-30 00:00:00 -1 month",

9 "2014-07-31 00:00:00 -1 month",

10 "2014-08-31 00:00:00 -1 month",

11 "2014-09-30 00:00:00 -1 month",

12 "2014-10-31 00:00:00 -1 month",

13 "2014-11-30 00:00:00 -1 month",

14 "2014-12-31 00:00:00 -1 month",

15);

1617

foreach ($datearr

as$val)18

我們看一下測試結果,從測試結果中,我們發現我們忽略了每個月天數不同,那麼strtotime()會帶來不一樣的結果

那麼究竟 strtotime("-$n month") 是怎麼計算的呢?在做乙個測試,如下:檢視一下結果

1

<?php23

$testtime = date("y-m-d h:i:s", time

());45

6$flag = 0;

7$time = 0;

8$tmp = 0;910

while(1)

11月前: , 日期: 差值:天 \r\n";

22 }

通過這個我們發現原來strtotime("-$n month")是這樣計算的 (注:strtotime("-$n month"),第二個引數省略,第二個引數表示距離的時間,省略表示當前時間)

時間差值

理論時間

結果7月31號

1月前6月31號

6月只有30天,則加一天到7月1號

7月31號

2月前5月31號

7月31號

3月前4月31號

4月只有30天,則加一天到5月1號

……那麼如果這樣的話,我們怎麼用strtotime("-$n month")處理我們的需求呢?

下面提供一段手寫**供參考

1

/****************

2*解決兩個時間段之間的年月

3* $btm, $etm 是unix時間戳

4*****************/5

function gettimedis($btm, $etm)6

month", $etmc

);23

24if($comptime

< $btm)25

break;26

27$resarr = date("ym", $comptime

);28}29

30return

array_unique($resarr

);31 }

union的謹慎使用

include using namespace std float float666 myfloat 666 myinteger myinteger 1 return myfloat int main float float666 float666 coutmyinteger也被賦值了,myinte...

謹慎使用viewWithTag

uilabel cl title self viewwithtag 101 cl title.text infos total time uilabel cl distance self viewwithtag 102 cl distance.text infos distance uilabel ...

謹慎使用C的遞迴

斐波那契數列 fibonacci 的定義如下 抽象為函式 這種遞迴形式的定義容易誤導人使用遞迴來實現,但是真的該使用遞迴嗎?每個遞迴呼叫都會觸發另外2個遞迴呼叫,而這2個呼叫的任何乙個又將觸發2個遞迴呼叫,再接下去的呼叫也是如此。這樣,冗餘計算的數量增長的非常快。當n 30時,等了一會,終於列印完了...