質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

1665閲覧

Railsで日付の文字列⇨Dateへの変換⇨Timeへの変換で齟齬が生じる

oeiqgfodgfhps

総合スコア35

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/09/04 12:37

編集2021/09/04 12:39

railsで作ったAPIに特定の日付のものをフェッチしてくるリクエストを処理する実装を行なっています。
クライアント側からdate = "2021-09-03 15:00:00 +0000"のようなリクエストが来たときにうまく正しい日付で検索をすることができません。このdateは2021-09-04を意味していますが、UTC時間での処理のため、9時間前の時間がリクエストとして投げられます。ちなみに検索をかけるカラムはcreated_atやupdated_atのようなデフォルトのものではなく、独自で用意したregstered_atというカラムでデータ型はdateTime型にしています。
これをrails側では下記のように処理しています。
date = Time.parse(params[:date]).to_date.to_time
Dateに変換し、その後にtimeに変換している理由ですが、例えばクライアント側からdate = "2021-09-03 18:30:20 +0000"のように0時ぴったりではないパラメーターが渡されることもあるからです。DBに入っている日付の値は全てクライアント側から0時のものが渡されます。それゆえにDBにはその9時間前の15:00:00のものが保存されているのので、15:00:00の時間で検索をかけなければいけません。(このカラムのデータ型をdateTimeではなく、Dateにすればいいだけかもしれませんが、そうしてもdateの値が一日前の値になってしまい、不整合が生じます。)
しかしdate = Time.parse(params[:date]).to_date.to_timeでのdateの時間部分は15:00:00ではなく、00:00:00になってしまいます。サーバーサイドで時間のずれを修正する必要があるのですが、どのように修正を行えばいいのでしょうか??

試したこと

カラムのデータ型をdateTimeからDateに変更したことで
date = Time.parse(params[:date]).to_dateとしたdateでも検索が行えるようになりましたが、1日前の日付が表示されてしまい、不整合が起こっています。date = Time.parse(params[:date]).to_date.tommorowとすれば期待通りに動きましたが、 tommorowとするのではなく、もっといい解決方法があるのではないかなと思いました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

date = Time.parse(params[:date]).localtime.to_date.to_time
するとどうなります?

投稿2021/09/04 13:12

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oeiqgfodgfhps

2021/09/04 13:28

期待通りの検索が出来ました! 一点質問させてください! 検索の際のdateの値は"2021-09-04 00:00:00 +0900"で検索されたデータは"2021-09-03 15:00:00 UTC"だったのですが、両者は同じ値ということでしょうか??
winterboum

2021/09/04 14:01

何をもって同じ値というか、ですが、 ruby的に == かというと多分 false でしょう。 どっかで変換されてます。 人間としては JST かUTC か 表記の違いだでで同じ値ですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問