台灣最大程式設計社群網站
線上人數
1320
 
會員總數:246274
討論主題:189809
歡迎您免費加入會員
討論區列表 >> PHP >> 使用 mktime 與 DATE_SUB 的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
使用 mktime 與 DATE_SUB 的問題
價值 : 100 QP  點閱數:1263 回應數:9
樓主

小羊窒息
高級顧問
52786 128
21002 5960
發送站內信

捐贈 VP 給 缺氧的羊:窒息
各位好, 我最近在維護一個系統, 裡面需要計算 【6個月前 ~ 今日】

而在mySQL直接下達下列指令, 會得到2月28日



但如果是在php內, 使用mktime, 則會得到 3月3日, 3月2日, 3月1日...



不曉得在php內, 要用什麼 比較快的方式來達成減6個月之後, 日期依然像mySQL的DATE_SUB一樣,
不會因為2月28日之後多了2日, 而變成3月2日之類的


搜尋相關Tags的文章: [ mktime ] , [ DATE_SUB ] ,
本篇文章發表於2011-10-31 17:00
== 簽名檔 ==
[再難的程式,當你知道怎麼寫時,就很簡單,問題就在於不知道怎麼寫]
[當你辛辛苦苦,嘔心瀝血,寫出一支你覺得沒有人寫的出來的程式時,
你會發現,早就已經有人寫出來了,不但寫的更好,而且還提供Source Code]
[Suffocation Sheep]

厚黑學鋸箭法:
鋸箭法是說有人中了箭,請外科醫生治療,
外科醫生把箭幹鋸了,然後就說弄好了,剩下的箭頭請找內科醫生…
1樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
認真來說~~~mktime原本最大的用處就是會幫你自動校正不正確的指定日期到正確的值用的法數。
所以當你第一個date("Y-m-d", mktime(0, 0, 0, ($tmonth-6), 31, 2011));
實際上也就是2-31號。但因為並沒有2-31這樣的日期。它會計算後算出2月只有28天。多出來3天就直接推算到3-3號去了。

在PHP埵乎沒有像MYSQL那樣的函數可以處理。但是似乎有相關的CLASS可以處理。要找一下就是了。
其實你也可以用個函數來處理讓它不會跨月。

本篇文章回覆於2011-11-01 10:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

溫子
捐贈 VP 給 溫子 檢舉此回應
既然是計算月份那就全部設為 1號 並取出該月最後一天 就好了

本篇文章回覆於2011-11-01 10:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
對喔~~~date有可以取得最後的d值。真是的~~~又學一招了。
本篇文章回覆於2011-11-01 10:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
to 溫子:

我不是只想抓該月最後一天呀,
如果今天是8月5號, 6個月前就必須是2月5號(這是當初的系統 規劃時的條件, 製作時也是這樣)
所以系統內, 在mySQL搜尋資料時, 是用Date_Sub 來取得前6個月的資料

而遇到6個月前沒有那麼多天時, 就是視為最後1天,
例如 8月30號 → 2月30(2月沒有30日, 所以視為2月底) → 2月28(如果是閏年就是2月29)


(我最近是遇到客戶在昨天10/31反應說,明明是6個月前,為什麼4月份的資料看不到,
所以想在操作畫面,把實際的系統認定日期顯示出來,讓客戶資料是4月28日∼10月31日,
而不是4月1日∼10月31日)
=============================

to 浩瀚星空:
那的確是一種解決方式

先判斷月份有沒有被系統自動修正,
如果有,就把增加的天數先扣掉,使其調整為最後一日



我做了一下調整,把一開始判斷月份的部份,改成判斷"日"
避免月份遇到負數(如果現在是2月份,減6個月就會變成 -4),而判斷失靈



話說回來,從這次日期問題中,我發現到,往回推【數個月】,會發生的事件
(今日)2011/02/28 → (6個月前) → 2010/08/28
(今日)2011/03/01 → (6個月前) → 2010/09/01 ... (8月29,30,31都不見了....)
也就是說, 如果客戶在2月28日時, 手上還有去年8月29日,30日,31日的東西沒有用掉的話,
過一天之後, 就......很有趣了

=.=


就像中華小廚師在考特級廚師時,要做出【不是麵的麵】!!
這應該也是...【不是bug的bug】...
本篇文章回覆於2011-11-01 11:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
不錯的參考

溫子
捐贈 VP 給 溫子 檢舉此回應
To 小羊窒息:
所以溫子都會與客戶溝通好...所謂的 六個月前 是多少天前!!

通常都會妥協在 180天 前的資料,也就是為避免 #4 的狀況~



客戶要的是持續堤供正確的資料,這樣反而資料更精確更簡單~
本篇文章回覆於2011-11-01 11:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
唉。。。這不是我的系統呀。。。。
(我接手時就已經是上線的系統了。。。)

之前有很多不合理的東西,光是改掉,就白白浪費了很多的時間
(現在公司的立場也是能不改條件就不改,
畢竟我們只是來幫忙讓系統能正常運作的,
客戶想改,就得額外收費)


我自己做的也都是扣天數的,
(之前是沒有想到這種問題,只是單純想到每個月天數不同,在算起迄時間會有問題,
所以跟你一樣會說服客戶用天數計,....大概是我運氣好吧,自己做的東西都有避開一些怪問題 XD)
本篇文章回覆於2011-11-01 12:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
或許你可以加上週期論的想法。因為我這堣]就是也有碰上類似的問題。

也就是所謂的取3個月前的資料。如今天是10/31。那所謂三個月前的資料是指 7、8、9月。不包含10月份的資料。或是8、9、10月。10月份計算到今天。
也就是依照月週期的計算方式。

如果要做往前推算的方式,一律是使用天數。
今天、昨天、本週、上週、本月、上月、前2個月、前3個月。(這堨是週期論)
1天前、3天前、7天前、30天前、60天前、90天前。(這奡N是天數制)

這樣的明定方式。就不容易發生問題。
本篇文章回覆於2011-11-01 12:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
(基本上,我不打算幫客戶解決這個問題了,給他一個文字附註說明就好,
請客戶提前用完,以免造成自身權益受損... XD)

回正題:
周期論,如果遇到今日呢(11月1日)
真的只給9月1日∼11月1日嗎?
本篇文章回覆於2011-11-01 12:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
是的
所謂週期論就是指 9 10 11月

就算11月還沒過完~~也一樣要算到11月底。
一般來說~~~在SQL內的條件式只會用%Y%m做條件。

這就是週期論。這樣也比較可以清楚明白。
但如果像遊戲計時制的方式。他們大多還是用天數制為主。

所以依照各情況要用不同的方式來處理。區分好要用週期或是天數制的方式。
其中用星期當週期的更要注意幾點。要從星期日起算還是從星期一起算。每月1號的周期是要列入當月的第1週期還是上月的最後週期。這些都是得要考量下去的。
(不過我星期大多是用年週期數為主,也就是1~54週)
本篇文章回覆於2011-11-01 13:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.