如何在Ruby中将秒转换为年

时间:2013-09-10 05:42:53

标签: ruby

我在exercism.io训练我的Ruby技能,而且我遇到space-age挑战。

我需要将1.000.000.000秒转​​换为年,我的测试需要31.69作为此转换的结果,但我的实现实际上返回31.71。下面我将展示:

def test_age_in_earth_years
  age = SpaceAge.new(1_000_000_000)
  assert_equal 31.69, age.on_earth
end

class SpaceAge
  def initialize(age_in_seconds)
    @age_in_seconds = age_in_seconds
  end

  def seconds
    @age_in_seconds
  end

  def on_earth
    (@age_in_seconds/31536000.00).round(2)
  end

end

任何提示?

3 个答案:

答案 0 :(得分:2)

一年平均为365.25天,这是31557600秒,而不是31536000秒。这解释了差异。

答案 1 :(得分:0)

只是进行向后计算,你想知道一年中假设的天数,如果1,000,000,000秒给你31.69年。

31.69 = 1,000,000,000 / (Y * 60 * 60 * 24) => Y = 365.228

这种暗示,如果你舍入到两位小数,那么Y = 365.25。如果你测试它,你得到~31.688,四舍五入到两位小数是31.69。除非您有更多数据,否则无法接近Y的原始值。

选择Y = 365.25是有道理的,如果您遵循每四年是闰年的规则,那么一年中的平均天数是365 + 1/4

然而,这并非完全正确,因为太阳年略短于365.25天,因此格里高利历忽略了每400年三个闰日。省略的天数是100的倍数,但不是400的倍数。所以1300,1400,1500不是闰年,而是1600和2000。所以一年中的平均天数是365 + 1/4 - 1/100 + 1/400 = 365.2425。

以上只是一个近似值,因为它不考虑闰秒。如果你想要完全准确,你需要一个实际的日期间隔,并找到一个闰秒表,并将这些考虑在内好。

答案 2 :(得分:0)

我可以通过这种方式获得预期的价值:

time = Time.at(1_000_000_000)
time.year - 1970 + (time.yday / 365.25).round(2) # => 31.69