55


13

従業員の時間を追跡するコードを持っています。 これは、従業員にどれだけの時間が経過したかを示すカウンターを作成します。

これが現在のコードです:

start_time = Time.parse(self.settings.first_clock_in)total_seconds = Time.now  -  start_time時間=(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を引くと、秒単位の差が生じます。

Note
Ruby 1.9.2以降、Timeの厳しい制限はなくなりました。 ただし、時間は1823-11-12と2116-02-20の間の値に最適化されています。

8 Answer


70


2つのDateTimesを減算すると経過日数が日数で返されるので、次のようにしてもかまいません。

経過時間=((終了時間 - 開始時間)* 24 * 60 * 60).to_i


48


あるいは、もっと読みやすい:

diff = datetime_1  -  datetime_2 diff * 1.日#=>秒単位の差。 Ruby on Railsが必要です

注意してください、あなたまたは他の何人かの検索者が本当に探しているかもしれないものはこれです:

diff = datetime_1  -  datetime_2 Date.day_fraction_to_time(diff)#=> [h、m、s、frac_s]


28


`+ 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 +を呼び出します`その上。


8


私はruby-2.1.4を使っていますが、私にとっては次のものがうまくいきました。

Time.now  -  Time.new(2014,11,05,17,30,0)

時間差を*秒*で教えてください

参照: ruby doc


8


他の人は誤って分数やヘルパー関数に頼っています。 それよりずっと簡単です。 DateTime自体はその下の整数です。 これがRubyのやり方です。

stop.to_i  -  start.to_i

例:

start = Time.now => 2016-06-21 14:55:36 -0700 stop =開始5秒=> 2016-06-21 14:55:41 -0700 stop.to_i  -  start.to_i => 5


3


そのためのメソッドがあります。

+ Time.now.minus_with_coercion(10.seconds.ago)+

10に等しい

ソース:http://apidock.com/rails/Time/minus_with_coercion

私が助けたことを願っています。


1


このようにRuby関数を定義してください。

def time_diff(開始時間、終了時間)seconds_diff =(開始時間 - 終了時間).to_i.abs

days = seconds_diff / 86400 seconds_diff  -  =日数* 86400

hours = seconds_diff / 3600 seconds_diff  -  =時間* 3600

分= seconds_diff / 60 seconds_diff  -  =分* 60

seconds = seconds_diff

"#{日}日#{時間}時間#{分}分#{秒}秒" end

そしてこの関数を呼び出します、

time_diff(Time.now、Time.now-4日-2時間-1分-53秒)


0


なぜ内蔵の「sec」を使わないのですか。 これが一例です。

t1 = Time.now.sec

経過時間= Time.now.sec  -  t1

「便利なことをするのに私には#{経過時間}秒かかりました。\ n」