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


## はじめに
６５歳の初心者が日付の表示方法について勉強しました。
### 日付の取り扱いで分かったこと。
・表示方法の変更は容易だが、入力画面のカスタマイズはあまり融通が効かないようだ。
・最初の日は　ITALY (1582年10月15日)らしい。
・Timeが基本でDateTimeで2020年9月で非推奨のだが、データベースとの関係等で、datetimeという定義は使う必要があるようだ。
[参考：datetimeをTimeにして困った例](https://qiita.com/NIssyi/items/918d6c43dcb7cf327ff7)
・railsのシステムでdatetimeが定義した日本時間ではなく、URC時間となるため、不具合が生ずるようだ。
### 日付の表示方法の選択について
　以下がよくわかるものでした。
[参考:strftimeではなくlメソッドを使おう](https://qiita.com/jnchito/items/831654253fb8a958ec25)
[参考：datetime_メソッドの使い方(古いので違うかも）](http://blog.livedoor.jp/sasata299/archives/51682324.html)
### 時刻を東京時間に変更
--この操作が不実行の方のみ--
config/application.rbに以下を追記
```php:application.rb
module ToDo
  class Application < Rails::Application
     　　config.load_defaults 7.0
　　　　　　　　--以下の一行を追加--
      config.time_zone = "Tokyo"
　　　　end
end
```
### 日本語対応の準備
--この操作が不実行の方のみ--
Gemfileの開発環境に以下を追記
```php:Gemfile
group :development do
  --以下の一行を追加-
  gem 'i18n_generators'
end
```
### 日本語対応に必要なja.ymlを生成
```php:ターミナル
rails g i18n_locale ja
```
conflict  config/application.rb等が表示されるが、「y」を連打すると
config/locales/ja.ymlが作成されている。
### 日付表示の確認
```php: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 を記載するこで実装される。
```php:XXXXX.html.erb
<%= l XXX.created_at %>
  →上記のdefaultが適用される。
<%= l XXX.created_at, format: :short %>
　　　→上記のshortが適用される。
```
default や　short を変更すると表示内容は変更できる。
## 入力フォームの日付表示
　表示する対象の前に　　l　(エル) を記載するこで実装される。
```php:XXXXX.html.erb
    --その１--
    <%= form.datetime_select :xxxtime %>
    --その２--
    <%= form.date_select :xxxtime %> 
    --その３--
    <%= form.datetime_field :xxxtime %>
    --その４--
    <%= form.date_field :xxxtime %>
    --その５--
    <%= form.time_select :xxxtime %>
    --その６--
    <%= form.time_field :xxxtime %>
```
こんな感じで表示される。
![スクリーンショット 2023-05-07 23.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344967/323e02c1-666c-acbd-c5bf-0e6f1796883b.png)
その３、その４、その６はカレンダーのような表で選択します。

:::note warn
 理解できていないが、dateとdatetimeを混在すると不具合が起こるそうだ。
:::
[dateとdatetimeの相性](https://qiita.com/squarekzmlviy/items/88e97d3ae3992cfd09da)

[railsの公式説明](https://rails.densan-labs.net/form/datetime_register_form.html)

[参考:古風な表示](https://shuzo-kino.hateblo.jp/entry/2016/03/12/233738)

### 日付の操作
日付の操作は直感的に覚えやすいみたいだ。
[参考　Railsでの日付操作でよく使うものまとめ](https://qiita.com/mmmm/items/efda48f1ac0267c95c29)

```php:XXXXX.html.erb
        --以前は.agoはsince--
        <%= task.limit.ago(5.days) %>
        <%= task.limit.since(5.years) %>
        <%= task.limit.since(5.munites) %>
```
色々、探して最も分かりやすいのは以下でした。ありがとうございました。
[参考: Ruby、Railsでの日付・時間の操作系メソッドまとめ](
https://qiita.com/supercell1023koeda/items/656c09c8ba4fdb5fffeb)
上記を参考に作成したもの
```php: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を利用など、私の以下の記事の続きとなる感じです。
[参考　:検索機能を実装する](https://qiita.com/matsumo33333/items/c96ca9a771d43343af29)
次に以下を参考に設定を行った。
[参考　日付選択検索とプルダウン選択](https://qiita.com/mmaumtjgj/items/34117cd07e9b7aa72585)
### 検索の準備
検索期間は、そのままだと当日の午前０時となるため、config/initializers/ransack.rbを作成し、”lteq_end_of_day”を定義することで、このずれを修正する。

:::note warn
下記のinitializersの定義変更後は要再起動
:::

```php: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などに検索機能を実装
```php: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の中身
```php: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
```
### 動作の確認

```markdown:ターミナル
 rails s
　--検索が動くことを確認--
```
## 最後に
　日付の操作は、excellのvbaでも苦労しましたが、慣れると簡単なのかも知れません。
　表示方式のカスタマイズやもっと高度な操作や検索方法など、勉強していきたいと思っております。
　色々苦労したのですが、最大の原因はrubyの日時のルールを知らないことでした。
[参考 rubyの基礎的な日時の使い方です](https://qiita.com/prgseek/items/c0fc2ffc8e1736348486#__anchor1)