赫謙小便籤

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

但是要注意,如果修改時間部分的話(也就是hourminsec)會根據順序去重新設定值。這是什麼意思呢?

假設我只修改hour的話,會把minsec給改為00;如果我只修改min的話,那只有sec會被改變為00

所以如果我只要修改hour而其餘不變的話,就得把整個hour,min,sec都給傳進去才會正常。

Comments