我有为员工做时间跟踪的代码。它创建一个计数器来向员工显示他们已经被打卡了多长时间。
这是当前的代码:
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
这可以很好地工作。但由于时间被限制在1970 - 2038年的范围内,我们正试图用DateTimes取代所有的时间使用。我想不出如何计算两个DateTimes之间的秒数。减去它们得到一个我不知道如何解释的理性,而减去时间得到以秒为单位的差值。
注意:从Ruby 1.9.2开始,移除了时间的硬限制。但是,时间针对1823-11-12和2116-02-20之间的值进行了优化。
发布于 2009-02-19 15:10:55
减去两个DateTimes将返回经过的时间(以天为单位),因此您可以这样做:
elapsed_seconds = ((end_time - start_time) * 24 * 60 * 60).to_i
发布于 2010-05-28 20:00:56
或者,更具可读性:
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]
发布于 2009-02-19 15:08:56
您可以使用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
。
https://stackoverflow.com/questions/567636
复制相似问题