従業員の時間を追跡するコードがあります。これは、従業員に出勤時間を示すカウンターを作成します。
これは現在のコードです:
start_time = Time.parse(self.settings.first_clock_in)
total_seconds = Time.now - start_time
hours = (total_seconds/ 3600).to_i
minutes = ((total_seconds % 3600) / 60).to_i
seconds = ((total_seconds % 3600) % 60).to_i
これは正常に機能します。しかし、Timeは1970〜2038の範囲に制限されているため、すべてのTimeの使用をDateTimeに置き換えようとしています。 2つのDateTime間の秒数を取得する方法がわかりません。それらを減算すると、解釈方法がわからないRationalが得られますが、Timesを減算すると秒単位の差が得られます。
注:Ruby 1.9.2であるため、Timeのハード制限は削除されます。ただし、Timeは1823-11-12から2116-02-20までの値に最適化されています。
2つのDateTimesを減算すると、経過時間が日数で返されるため、次のようにできます。
elapsed_seconds = ((end_time - start_time) * 24 * 60 * 60).to_i
または、より読みやすい:
diff = datetime_1 - datetime_2
diff * 1.days # => difference in seconds; requires Ruby on Rails
あなたや他の検索者が本当に探しているのはこれです:
diff = datetime_1 - datetime_2
Date.day_fraction_to_time(diff) # => [h, m, s, frac_s]
to_f
を使用してそれらを浮動小数点数に変換できますが、浮動小数点数に関連する通常の精度が失われます。整数秒だけ整数にキャストしている場合は、心配するほど大きくないはずです。
結果は秒単位です。
>> end_time.to_f - start_time.to_f
=> 7.39954495429993
>> (end_time.to_f - start_time.to_f).to_i
=> 7
それ以外の場合は、DateTimeオブジェクトでto_formatted_s
を使用して、出力をDecimal
クラスが受け入れるものに変換できるかどうかを確認するか、単純なUnix時間を文字列としてフォーマットして呼び出しますto_i
.
その他は、分数またはヘルパー関数に誤って依存しています。それよりもはるかに簡単です。 DateTime自体は、整数です。 Ruby方法:
stop.to_i - start.to_i
例:
start = Time.now
=> 2016-06-21 14:55:36 -0700
stop = start + 5.seconds
=> 2016-06-21 14:55:41 -0700
stop.to_i - start.to_i
=> 5
私はRuby-2.1.4を使用していますが、私にとっては以下がうまくいきました
Time.now - Time.new(2014,11,05,17,30,0)
秒の時間差を教えてくれました
参照: Ruby doc
そのためのメソッドがあります:
Time.now.minus_with_coercion(10.seconds.ago)
10に等しい。
ソース: http://apidock.com/Rails/Time/minus_with_coercion
お役に立てば幸いです。
このようなRuby関数を定義し、
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).to_i.abs
days = seconds_diff / 86400
seconds_diff -= days * 86400
hours = seconds_diff / 3600
seconds_diff -= hours * 3600
minutes = seconds_diff / 60
seconds_diff -= minutes * 60
seconds = seconds_diff
"#{days} Days #{hours} Hrs #{minutes} Min #{seconds} Sec"
end
そして、この関数を呼び出して、
time_diff(Time.now, Time.now-4.days-2.hours-1.minutes-53.seconds)
組み込みの「sec」を使用しないのはなぜですか。以下に例を示します。
t1 = Time.now.sec
elapsed_t = Time.now.sec - t1
puts "it took me : #{elapsed_t} seconds to do something that is useful \n"