LoginSignup
0
0

More than 1 year has passed since last update.

65歳、初心者がrailsの色々な日付機能を勉強しました。

Last updated at Posted at 2023-05-08

はじめに

65歳の初心者が日付の表示方法について勉強しました。

日付の取り扱いで分かったこと。

・表示方法の変更は容易だが、入力画面のカスタマイズはあまり融通が効かないようだ。
・最初の日は ITALY (1582年10月15日)らしい。
・Timeが基本でDateTimeで2020年9月で非推奨のだが、データベースとの関係等で、datetimeという定義は使う必要があるようだ。
参考:datetimeをTimeにして困った例
・railsのシステムでdatetimeが定義した日本時間ではなく、URC時間となるため、不具合が生ずるようだ。

日付の表示方法の選択について

 以下がよくわかるものでした。
参考:strftimeではなくlメソッドを使おう
参考:datetime_メソッドの使い方(古いので違うかも)

時刻を東京時間に変更

--この操作が不実行の方のみ--
config/application.rbに以下を追記

application.rb
module ToDo
  class Application < Rails::Application
       config.load_defaults 7.0
        --以下の一行を追加--
      config.time_zone = "Tokyo"
    end
end

日本語対応の準備

--この操作が不実行の方のみ--
Gemfileの開発環境に以下を追記

Gemfile
group :development do
  --以下の一行を追加-
  gem 'i18n_generators'
end

日本語対応に必要なja.ymlを生成

ターミナル
rails g i18n_locale ja

conflict config/application.rb等が表示されるが、「y」を連打すると
config/locales/ja.ymlが作成されている。

日付表示の確認

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 を記載するこで実装される。

XXXXX.html.erb
<%= l XXX.created_at %>
  上記のdefaultが適用される
<%= l XXX.created_at, format: :short %>
   →上記のshortが適用される

default や short を変更すると表示内容は変更できる。

入力フォームの日付表示

 表示する対象の前に  l (エル) を記載するこで実装される。

XXXXX.html.erb
    --その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 %>

こんな感じで表示される。
スクリーンショット 2023-05-07 23.23.45.png
その3、その4、その6はカレンダーのような表で選択します。

理解できていないが、dateとdatetimeを混在すると不具合が起こるそうだ。

dateとdatetimeの相性

railsの公式説明

参考:古風な表示

日付の操作

日付の操作は直感的に覚えやすいみたいだ。
参考 Railsでの日付操作でよく使うものまとめ

XXXXX.html.erb
        --以前は.agoはsince--
        <%= task.limit.ago(5.days) %>
        <%= task.limit.since(5.years) %>
        <%= task.limit.since(5.munites) %>

色々、探して最も分かりやすいのは以下でした。ありがとうございました。
参考: Ruby、Railsでの日付・時間の操作系メソッドまとめ
上記を参考に作成したもの

XXXXX.html.erb
  --まず,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.rb
 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などに検索機能を実装

XXXXX.html.erb
<%= 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の中身

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の基礎的な日時の使い方です

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0