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都給傳進去才會正常。