Rubyの時刻操作
#ruby
現在の日付と時刻
code:ruby
Time.now # 現在の日時(ローカルタイムゾーン)
Time.now.utc # 現在の日時(UTC)
Date.today # 現在の日付
DateTime.now # 現在の日時(DateTimeオブジェクト)
code:ruby
Time.zone.now # 設定されたタイムゾーンの現在時刻
Time.current # Railsに設定されたタイムゾーンの現在時刻(基本的にコレを使おう!!)
ActiveSupport拡張
Time.nowとTime.currentの違い
日付と時刻の作成
code:ruby
Date.new(2024, 1, 20) # 2024年1月20日
Time.new(2024, 1, 20, 12, 0, 0) # 2024年1月20日12時0分0秒
DateTime.new(2024, 1, 20, 12, 0, 0) # 2024年1月20日12時0分0秒(DateTimeオブジェクト)
code:ruby
Time.zone.local(2024, 1, 20) # 指定されたタイムゾーンでの特定の日時
ActiveSupport拡張
日付と時刻の変更
code:ruby
Time.now.beginning_of_month # 今月の初めの日時
Time.now.end_of_day # 今日の終わり(23:59:59)の日時
ActiveSupport拡張
日付と時刻のフォーマット
code:ruby
Time.now.strftime("%Y-%m-%d %H:%M:%S") # "YYYY-MM-DD HH:MM:SS" フォーマット
Date.today.strftime("%d/%m/%Y") # "DD/MM/YYYY" フォーマット
time = Time.now
time.strftime("%Y-%m-%d %H:%M:%S") # YYYY-MM-DD HH:MM:SS 形式
time.strftime("%d/%m/%Y") # DD/MM/YYYY 形式
time.strftime("%I:%M%p") # 時:分AM/PM 形式
# 例: "2024-01-20 12:30:45", "20/01/2024", "12:30PM"
code:ruby
Time.current.to_s(:short) # "20 Jan 12:30"
Time.current.to_s(:long) # "January 20, 2024 12:30"
# カスタムフォーマット(例: :db, :number)
Time.current.to_formatted_s(:db) # "2024-01-20 12:30:45"
Time.current.to_formatted_s(:number) # "20240120123045"
# ISO 8601 フォーマット
Time.current.iso8601 # "2024-01-20T12:30:45+09:00"
ActiveSupport拡張
hiroki.icondbとisoはめちゃ便利だ!!
日付と時刻の計算
code:ruby
# Durationに生えてる
2.hours.from_now # 現在から2時間後
3.days.ago # 3日前
# Date / Timeに生えてる
5.weeks.since(Date.today) # 今日から5週間後の日付
1.year.until(Time.now) # 現在から1年前
ActiveSupport拡張
過去→ago , until
未来→from_now , scince
持続期間の計算
code:ruby
1.second # 1秒
2.minutes # 2分
3.hours # 3時間
4.days # 4日
5.weeks # 5週間
6.months # 6ヶ月
7.years # 7年
1.year.ago + 1.day # 1年前の1日あと
1.week + 3.days + 2.hours # 1週間3日2時間の持続時間を表す
10.minutes.to_i # 分を秒に変換
10.minutes == 600.seconds # true
1.day > 1.hour # true
10.minutes.in_seconds # 秒数(600秒)
2.hours.in_minutes # 分数(120分)
1.day.in_hours # 時間数(24時間)
ActiveSupport拡張
ActiveSupport::Durationオブジェクト
持続時間を表すオブジェクト
適切なコンテキストでいい感じに秒数に変換されたりする
日付の範囲
code:ruby
(Date.today.beginning_of_week..Date.today.end_of_week).cover?(Date.yesterday) # 今週の範囲に昨日が含まれるかどうか
where(created_at: Time.zone.today.all_month)
# all_day , all_week , all_month , all_year
ActiveSupport拡張
日付と時刻の判定
code:ruby
# 2017年9月30日(土)の場合
Time.zone.today # => Sat, 30 Sep 2017
Time.zone.today.on_weekday? # => false
Time.zone.today.on_weekend? # => true
ActiveSupport拡張
現在時刻の変更と固定
code:ruby
# 現在時刻を特定の日時に設定
travel_to Time.new(2024, 1, 20, 10, 0, 0) do
# ここでは時刻が2024年1月20日10時0分0秒
end
# 現在時刻を凍結
freeze_time do
# ここでは時刻がブロックが開始した瞬間に凍結される
end
travel 2.hours do
# 現在時刻から2時間進んだ時刻でコードを実行
end
travel_back
ActiveSupport拡張TimeHelpersモジュール
/icons/hr.icon
DateTime クラスは、Ruby における日付と時刻の操作に関するクラスの一つで、Date クラスと Time クラスの機能をあわせ持つ特性があります。Date、Time、および DateTime の主な違いをまとめる
Date クラス
Date クラスは、日付のみを扱います(年、月、日)
時刻(時、分、秒)は扱わない
日付に関連する操作(例えば、明日の日付を求めるなど)に特化している
TimeZoneの情報がない
Time クラス
Time クラスは、日付と時刻の両方を扱う
タイムゾーンのサポートがあり、ローカルタイムゾーンまたはUTC(協定世界時)で時刻を扱うことができる
マイクロ秒単位までの精度を持ち、パフォーマンスも高いため、現在時刻の取得や比較などに適している
DateTime クラス
DateTime クラスも日付と時刻の両方を扱いますが、Time よりも広い範囲の日付(紀元前や遠い未来の日付)をサポートします
タイムゾーンのサポートがありますが、Time クラスほどの性能はない
Time クラスよりも歴史的な日付を扱う際に有用です。例えば、過去数百年の日付計算などに使われることがある
使い分け
現代のアプリケーションにおいては、一般的に Time クラスが最もよく使われる。性能が良く、ほとんどの日付と時刻に関するニーズを満たすため
Date クラスは、時刻を扱う必要がない日付のみの操作の場合
DateTime クラスは、歴史的な日付や、Time クラスの範囲外の日付を扱う必要がある場合に選択されることがあります
現代の日付と時刻に関連する一般的なアプリケーションにおいては、Time クラスが優先される
/icons/hr.icon
Date
Module: ActiveSupport::CoreExtensions::Date::Calculations
#Ruby と #Rails の Time や Time.zone の扱いががマジで分からないし混沌としてるのでちょっとだけ整理したい。 #Ruby - Qiita
1歳6ヶ月に達する日を計算する過程で知るRailsの日付計算の罠 - SmartHR Tech Blog