40

学校の授業を追跡するアプリを書いています。

スケジュールを保存する必要があります。例:月曜日から金曜日の午前8時から午前11時

単純な文字列列を使用することを考えていましたが、後で時間の計算を行う必要があります。

たとえば、start_at:8am end_at:11amなどの午前8時の表現を保存する必要があります

では、どのように時間を保存する必要がありますか?どのデータ型を使用する必要がありますか?開始時間と秒数または分数を保存して、そこから計算する必要がありますか?またはもっと簡単な方法はありますか?

私は本番環境にMySQLを使用し、開発にSQLiteを使用しています。

4

8 に答える 8

23

最近、この問題に取り組む必要のあるアプリを作成しました。シンプルな営業時間モデルで、open_at と closed_at を午前 0 時からの秒単位で格納することにしました。ActiveSupport には、午前 0 時からの時間を秒単位で調べるための便利なヘルパーが含まれています。

Time.now.seconds_since_midnight

このようにして、簡単なクエリを実行して、会場が開いているかどうかを確認できます。

BusinessHour.where("open_at > ? and close_at < ?", Time.now.seconds_since_midnight, Time.now.seconds_since_midnight)

これを改善するためのヒントをいただければ幸いです =)

于 2013-03-12T00:06:17.650 に答える
12

Postgresql を使用している場合はtime、時刻のみで日付のない列タイプを使用できます。その後、クエリを実行できます

Event.where("start_time > '10:00:00' and end_time < '12:00:00'")

おそらくMySQLには似たようなものがあります

于 2013-11-26T23:05:53.407 に答える
9

Rails 4の gem 'tod'または Rails 3 の Time_of_Day を確認してください。どちらも、Active Record モデルを使用しているときにデータベースに時間を格納する問題を解決します。

SQL には時刻データ型がありますが、Ruby にはありません。Active Record は、正規の日付 2000-01-01 で Ruby の Time クラスを使用して時間属性を表すことにより、この違いに対処します。すべての時間属性には、任意に同じ日付が割り当てられます。属性は問題なく相互に比較できますが (日付は同じです)、それらを他の Time インスタンスと比較しようとするとエラーが発生します。「10:05」のような文字列に対して Time.parse を使用するだけで、今日の日付が出力に追加されます。

Lailson Bandeira は、この問題に対する解決策として、Rails 3 の Time_of_Day gem を作成しました。残念ながら、この gem はもはやメンテナンスされていません。代わりに、Jack Christensen の 'tod' gem を使用してください。それは魅力のように機能します。

于 2014-09-10T04:21:04.030 に答える
3

この ruby​​ gemは、時刻を真夜中からの秒数に変換します。秒の値はデータベースに保存され、計算と検証に使用できます。

時刻属性を定義します。

class BusinessHour < ActiveRecord::Base
  time_of_day_attr :opening, :closing
end

文字列が設定された時刻を午前 0 時からの秒数に変換します。

business_hour = BusinessHour.new(opening: '9:00', closing: '17:00')
business_hour.opening
 => 32400
business_hour.closing
 => 61200

時刻に戻すには:

TimeOfDayAttr.l(business_hour.opening)
 => '9:00'
TimeOfDayAttr.l(business_hour.closing)
 => '17:00'

正時の分を省略することもできます。

TimeOfDayAttr.l(business_hour.opening, omit_minutes_at_full_hour: true)
 => '9'
于 2014-01-05T11:24:51.753 に答える
2

2 つの整数列を使用して、データベース内に開始時間と期間を格納します。

両方の値を取得することで、開始時間を次のように変換できます (その日がすでにわかっていると仮定すると、次のようになります。

# assuming date is the date of the day, datetime will hold the start time
datetime = date.change({:hour => your_stored_hour_value , :min => 0 , :sec => 0 })

# calculating the end time
end_time = datetime + your_stored_duration.seconds

それ以外の場合は、Chronicをご覧ください。この宝石は、取り扱い時間を少し楽にします。このchangeメソッドは Rails の一部であり、プレーンな Ruby では使用できないことに注意してください。

DateTimeプレーン Rubyのドキュメントは、ここにあります。

また、何をするにしても、日付/時刻を 12 時間形式で保存しないでください。RailsI18nで時刻を変換するために使用できます。

I18n.l Time.now, :format => "%I.%m %p",  :locale => :"en"
I18n.l Time.now + 12.hours, :format => "%I.%m %p",  :locale => :"en"

この表記法から、期間を時間単位で保存できることもわかります。必要に応じて、次の方法で簡単に変換できます。

your_stored_value.hours

整数として格納されている場合、つまり。

于 2012-08-15T17:18:23.197 に答える
1

提案:

そのための特定のデータ型について心配する必要はありません。簡単な解決策は次のとおりです。

  1. データベースに、start_time用の整数型列とend_time用の別の列を追加します。それぞれに、午前 0 時からの分数が格納されます。 例: 午前 8:30 は 510 (8*60+30) として格納されます

  2. フォームで、利用可能なすべての時間を時刻形式で表示する選択
    フィールド (ドロップダウン) を作成します:例: 午前 10 時、午前 10 時 30 分など。
    ただし、データベースに保存される実際のフィールド値は、それらに相当する整数です:
    例: 600、630 など (上記の例に従います)

于 2016-02-04T06:10:59.853 に答える
0

SQLite 3 Web サイトから、

「SQLiteには、日付や時刻を保存するためのストレージクラスがありません。代わりに、SQLiteの組み込みの日付と時刻関数は、日付と時刻をTEXT、REAL、またはINTEGER値として保存できます。

ISO8601 文字列としての TEXT ("YYYY-MM-DD HH:MM:SS.SSS")。ユリウス日としての REAL。先発グレゴリオ暦による紀元前 4714 年 11 月 24 日のグリニッジ正午からの日数。UNIX 時間としての INTEGER、1970-01-01 00:00:00 UTC からの秒数。アプリケーションは、日付と時刻をこれらの形式のいずれかで保存し、組み込みの日付と時刻関数を使用して形式を自由に変換できます。」

次に、ここで概説されている日付関数と時刻関数を使用して値を操作できます。

于 2012-08-15T17:05:39.543 に答える
0

これにはある種のデータベースを使用していると思います。MySQL または Postgresql を使用している場合は、データベースへの読み取り/書き込み時にdatetimeRuby/Rails がオブジェクトとの間で自動的に変換する列型を使用できます。Timesqlite に似たようなものがあるかどうかはわかりませんが、おそらくあると思います。

于 2012-08-15T16:49:26.820 に答える