はじめに
65歳の初心者が日付の表示方法について勉強しました。
日付の取り扱いで分かったこと。
・表示方法の変更は容易だが、入力画面のカスタマイズはあまり融通が効かないようだ。
・最初の日は ITALY (1582年10月15日)らしい。
・Timeが基本でDateTimeで2020年9月で非推奨のだが、データベースとの関係等で、datetimeという定義は使う必要があるようだ。
参考:datetimeをTimeにして困った例
・railsのシステムでdatetimeが定義した日本時間ではなく、URC時間となるため、不具合が生ずるようだ。
日付の表示方法の選択について
以下がよくわかるものでした。
参考:strftimeではなくlメソッドを使おう
参考:datetime_メソッドの使い方(古いので違うかも)
時刻を東京時間に変更
--この操作が不実行の方のみ--
config/application.rbに以下を追記
module ToDo
class Application < Rails::Application
config.load_defaults 7.0
--以下の一行を追加--
config.time_zone = "Tokyo"
end
end
日本語対応の準備
--この操作が不実行の方のみ--
Gemfileの開発環境に以下を追記
group :development do
--以下の一行を追加-
gem 'i18n_generators'
end
日本語対応に必要なja.ymlを生成
rails g i18n_locale ja
conflict config/application.rb等が表示されるが、「y」を連打すると
config/locales/ja.ymlが作成されている。
日付表示の確認
time:
am: 午前
formats:
--ここからが時間表示の設定--
default: "%Y年%m月%d日(%a) %H時%M分"
long: "%Y/%m/%d %H:%M"
short: "%m月%d日(%a) %H時%M分"
--ここまでで最後の行は少し修正しています--
pm: 午後
日付表示の実装
表示する対象の前に l を記載するこで実装される。
<%= l XXX.created_at %>
→上記のdefaultが適用される。
<%= l XXX.created_at, format: :short %>
→上記のshortが適用される。
default や short を変更すると表示内容は変更できる。
入力フォームの日付表示
表示する対象の前に l (エル) を記載するこで実装される。
--その1--
<%= form.datetime_select :xxxtime %>
--その2--
<%= form.date_select :xxxtime %>
--その3--
<%= form.datetime_field :xxxtime %>
--その4--
<%= form.date_field :xxxtime %>
--その5--
<%= form.time_select :xxxtime %>
--その6--
<%= form.time_field :xxxtime %>
こんな感じで表示される。
その3、その4、その6はカレンダーのような表で選択します。
理解できていないが、dateとdatetimeを混在すると不具合が起こるそうだ。
日付の操作
日付の操作は直感的に覚えやすいみたいだ。
参考 Railsでの日付操作でよく使うものまとめ
--以前は.agoはsince--
<%= task.limit.ago(5.days) %>
<%= task.limit.since(5.years) %>
<%= task.limit.since(5.munites) %>
色々、探して最も分かりやすいのは以下でした。ありがとうございました。
参考: Ruby、Railsでの日付・時間の操作系メソッドまとめ
上記を参考に作成したもの
--まず,requireでの宣言が必要--
<% require 'date' %>
<%= today = DateTime.new(2021,4,29,0,0,0) %>
--「,」以降の数字は分母となるので、以下は秒の操作--
<%= today + Rational(1,24*60*60) %>
--変数を挿入しても動くようだ--
<% u = 3 %>
<%= l today + Rational(u) %>
日付の検索
日付検索もransakを利用など、私の以下の記事の続きとなる感じです。
参考 :検索機能を実装する
次に以下を参考に設定を行った。
参考 日付選択検索とプルダウン選択
検索の準備
検索期間は、そのままだと当日の午前0時となるため、config/initializers/ransack.rbを作成し、”lteq_end_of_day”を定義することで、このずれを修正する。
下記のinitializersの定義変更後は要再起動
Ransack.configure do |config|
config.add_predicate 'lteq_end_of_day',
:arel_predicate => 'lteq',
:formatter => proc {|v| v.end_of_day},
:compounds => false
end
indexなどに検索機能を実装
<%= search_form_for @q do |f| %>
<%= f.date_field :starttime_gteq %>
<span>~</span>
<%= f.date_field :starttime_lteq_end_of_day %>
<%= f.submit %>
<% end %>
date_field ではカレンダーが
date_selectでは選択方式のものが表示されます。
modlesの変更
app/modeles/task.rbの中身
class Task < ApplicationRecord
def self.ransackable_associations(auth_object = nil)
['title', 'content','created_at','starttime']
end
def self.ransackable_attributes(auth_object = nil)
['title', 'content','created_at','starttime']
end
end
動作の確認
rails s
--検索が動くことを確認--
最後に
日付の操作は、excellのvbaでも苦労しましたが、慣れると簡単なのかも知れません。
表示方式のカスタマイズやもっと高度な操作や検索方法など、勉強していきたいと思っております。
色々苦労したのですが、最大の原因はrubyの日時のルールを知らないことでした。
参考 rubyの基礎的な日時の使い方です