Rails 的 DateTime#change
最近在寫一個東西,要取得時間並且扔到SQL內做BETWEEN運算,所以我這樣寫
now = Time.now
objs = Obj.where({created_at: (now..(now+1.minutes))})
這樣執行後我發現會有問題,因為我其實只要把精準度調到分鐘,但是傳入的卻是到秒,也就是說我要的是類似 2012-01-01 10:20:00
這樣的格式,但是傳入的會是 2012-01-01 10:20:30
這樣的格式
所以為了解決這個辦法,我只好寫了很髒的code
now = Time.now; now -= now.sec.seconds
這真的夠髒了 …
後來為了某個功能(也許下篇會說)跑去APIDock查API,發現到Rails擴充了DateTime
加入了change
這個功能,才發現原來我API真的不熟啊 … Orz
所以要怎麼用呢?
假設我現在時間是2012-01-02 03:04:05
,想要把秒數改為30
的話,我可以這樣做:
now = "2012-01-02 03:04:05"
now.change({sec: 30})
除了改秒數,也能改年份,所有可以改的參數:
- year
- month
- day
- hour
- min
- sec
- offset
- start
但是要注意,如果修改時間部分的話(也就是hour
、min
、sec
)會根據順序去重新設定值。這是什麼意思呢?
假設我只修改hour
的話,會把min
跟sec
給改為00
;如果我只修改min
的話,那只有sec
會被改變為00
。
所以如果我只要修改hour
而其餘不變的話,就得把整個hour
,min
,sec
都給傳進去才會正常。