Rubyの時刻操作
現在の日付と時刻
code:ruby
Time.now # 現在の日時(ローカルタイムゾーン)
Time.now.utc # 現在の日時(UTC)
Date.today # 現在の日付
DateTime.now # 現在の日時(DateTimeオブジェクト)
code:ruby
Time.zone.now # 設定されたタイムゾーンの現在時刻
Time.current # Railsに設定されたタイムゾーンの現在時刻(基本的にコレを使おう!!)
日付と時刻の作成
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) # 指定されたタイムゾーンでの特定の日時
日付と時刻の変更
code:ruby
Time.now.beginning_of_month # 今月の初めの日時
Time.now.end_of_day # 今日の終わり(23:59:59)の日時
日付と時刻のフォーマット
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"
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年前
過去→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時間)
持続時間を表すオブジェクト
適切なコンテキストでいい感じに秒数に変換されたりする
日付の範囲
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
日付と時刻の判定
code:ruby
# 2017年9月30日(土)の場合
Time.zone.today # => Sat, 30 Sep 2017
Time.zone.today.on_weekday? # => false
Time.zone.today.on_weekend? # => true
現在時刻の変更と固定
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
/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