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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

444閲覧

指定の曜日を取り出して、一定時間ごとの時間を作成したい(ruby)

yamady

総合スコア176

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/10/08 07:03

編集2018/10/08 09:14

お世話になっております。

今日から2週間のうち、指定の曜日selectedDayを取り出して、
最終的にその開始時間start_atから終了時間までを30分ごとtimeで配列で
取得したいと考えています。

現在はrails cで開かれるirbのコンソール上で試しています。

参考URL:http://www.tom08.net/entry/2017/05/28/115605

使っているライブラリ

Rails 5.2

エラー

* 曜日のdateを数値に変換することができない * list_dateを実行しても期待通りの結果が得られない [32] pry(main)> start_at = '10:00' => "10:00" [33] pry(main)> end_at = '20:00' => "20:00" [43] pry(main)> list_date = ['2018-10-1', '2018-10-3'] => ["2018-10-1", "2018-10-3"] [45] pry(main)> time = 30 => 30 [47] pry(main)> list_date.each do |date| [47] pry(main)* increment = time.to_i [47] pry(main)* from_time = start_at.to_i [47] pry(main)* to_time = end_at.to_i [47] pry(main)* from_time.step(to_time, increment).map { [47] pry(main)* |m| confirmTime = date + Time.at(m).strftime('%H:%M'[47] pry(main)* |m| confirmTime = date + Time.at(m).strftime('%H:%M') [47] pry(main)* puts confirmTime [47] pry(main)* } [47] pry(main)* end 2018-10-109:00 2018-10-309:00 => ["2018-10-1", "2018-10-3"]

想定成果物

2018/10/1 10:00 2018/10/1 10:30 2018/10/1 11:00 2018/10/1 11:30 2018/10/1 12:00 ・・・ 2018/10/3 10:00 2018/10/3 10:30 2018/10/3 11:00 2018/10/3 11:30 ・・・

ソースコード

Ruby

1 fixed_date = [] 2 confirm_date = [] 3 selected_day = ['mon', 'tues', 'wed'] 4 start_at = '10:00' 5 end_at = '20:00' 6  time = 30 7 8 first_date = Date.today 9 end_date = first_date.since(2.weeks) 10 11 available_date.each do |day| 12    # dayが従来曜日で取れているが、これを数値に変換するためにはどうすれば良いか 13 (first_date..end_date).select{|d| d.wday == day}.each do |date| 14 list_date.push(date.strftime("Y-m-d")) 15 end 16 end 17 18 list_date.each do |date| 19 increment = time.to_i 20 from_time = start_at.to_i 21 to_time = end_at.to_i 22 from_time.step(to_time, increment).map { 23 |m| confirmTime = date + Time.at(m).strftime('%H:%M') 24 confirm_date.push(confirmTime) 25 } 26 end

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

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

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

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

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

mather

2018/10/08 07:42 編集

start_at, end_atが参考URLの内容とは全然違うクラスになっていますよね…。また、部分的に抜き出されたコードのようですし、使用しているライブラリもわかりません。質問に記載してください。
yamady

2018/10/08 08:49

失礼いたしました。またご指摘ありがとうございました統一し、またライブラリは使用していません。
mather

2018/10/08 08:53

いや、思いっきり使ってますよ。 2.weeksなどのように記述できるのはactive_supportですね。つまり、Railsです。
yamady

2018/10/08 08:55

大変申し訳ございませんでした。再度書き直します
mather

2018/10/08 09:04

そもそもこのソースコードがRailsのソースコードの一部分なので、普通にやっても動かないはずですよね。さらにlist_dateの宣言がなかったり…。試したことと問題点を明確に書いてください。irbのサンプルコードの話だけなら、その部分だけを質問したい旨を書いたほうがいいです。
yamady

2018/10/08 09:15

申し訳ございませんでした。ご指摘の通りです。反省いたします。。
guest

回答1

0

ベストアンサー

ブログ記事から部分的なソースコードをコピペをしても、まともにコードが動くはずがありません。
元のコードの内容を理解して自分の場合はどうすればいいのか考える必要があります。

参照URLの元のコードを見てみましょう。

def create_delivery_times_every(time) increment = time.to_i from_time = from_delivery_time.to_i to_time = to_delivery_time.to_i from_time.step(to_time, increment).map { |m| Time.at(m).strftime('%H:%M') } end

from_delivery_timeDateTime クラスの値です。 DateTime#to_i は標準のRubyにはなく、AcriveSupportによる拡張です。この結果として from_time, to_time は秒数になります。
https://apidock.com/rails/ActiveSupport/CoreExtensions/DateTime/Conversions/to_i
Epoh

引数の time.to_i を実行しているということは、おそらく time は数値である保証がないんでしょう。
かならず整数で与えられるとわかっているなら必要はないと思います。

次に、 from_time.step(to_time, increment) ですが、 step は次のようなEnumaratorを作ります。元のソースコードでは from_time から30分ずつずらしたリストでしたね。

irb(main):026:0> 0.step(10000, 30*60) => #<Enumerator: 0:step(10000, 1800)> irb(main):027:0> 0.step(10000, 30*60).to_a => [0, 1800, 3600, 5400, 7200, 9000]

これに対して .map を実行することで一つ一つの要素に対して処理を実行した配列になります。

Time.at で Epoch time を Time クラスに変換し、それを strftime で時刻文字列に変換しています。

以上、解説です。ご自身のコードで一致する部分、一致しない部分を見極めて、どうやればいいか考えてみてください。
もし、参照URLの方法にこだわらず問題を解決したいのであれば質問を更新してください。

投稿2018/10/08 11:24

mather

総合スコア6753

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

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

yamady

2018/10/10 03:13

ご丁寧な回答をいただきまして、誠にありがとうございました。 ご指摘をいただきまして、参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問