跳至主要内容

[Rails] 時間相關函式(Time)

keywords: time, date, datetime

Ruby

Time.now                              # => 2017-10-04 20:48:52 +0800
Time.now.strftime('%Y/%m/%d') # => "2017/10/04"
Time.now.strftime('%Y/%m/%d %T') # => "2017/12/19 11:27:11"
Time.now.strftime('%Y/%m/%d %R') # => "2017/12/19 11:28"
Time.now.strftime('%Y/%m/%d %I:%M %p') # => "2017/12/19 11:27 AM"
Time.now.strftime('%F') # => "2018-01-12"
Time.now.strftime('%F %R') # => "2018-01-15 17:18"
Time.now.strftime("%B %e, %Y at %I:%M %p") # => "March 23, 2013 at 09:48 AM"

Rails

# 根據使用者機器的時區,忽略你設定的時區(不建議)
Time.now
Time.now + 5.days # => 2017-10-09 20:47:07 +0800
Time.now.beginning_of_day # => 2017-10-04 00:00:00 +0800

# 根據在 config/application.rb 中所設定的時區(建議)
Time.zone.now # 使用設定的 Timezone
Time.current # 等同於 Time.zone.now
1.day.from_now # 從現在往後推算一天
1.day.ago # 從現在往前推算一天

Time.current.utc.iso8601 # 將時間轉成 utc iso8601 傳送給 app
Time.zone.parse(time_string) # 解析時間,並轉成伺服器時區
Time.zone.strptime(time_string, '%Y-%m-%dT%H:%M:%S%z') # 解析時間,並轉成伺服器時區

設定時區

# config/application.rb
config.time_zone = 'Taipei'

取得時區

$ rake time:zones:all      # 會列出所有時區

比較時間

e.start_at > Time.now    # false / true

查詢時間

Post.where(['posts.published_at > ?', Time.current])

傳送時間資訊

傳送時間資訊到客戶端(APP)時,記得使用 utc.iso8601 轉成 UTC 格式:

# 伺服器傳送 utc iso8601 的時間格式給 APP
time_string = Time.current.utc.iso8601 # "2018-08-14T07:09:41Z"

接收由客戶端傳來的時間資訊:

# APP 傳送 utc iso8601 的時間格式給伺服器,並轉換成伺服器時區
Time.zone.parse(time_string) # Mon, 13 Aug 2018 23:09:41 AKDT -08:00
Time.zone.strptime(time_string, '%Y-%m-%dT%H:%M:%S%z')

# 如果只是使用 Time.parse 不會轉成正確的時區,而是保留為 UTC
Time.parse(time_string) # 2018-08-14 07:09:41 UTC

參考資料