【问题标题】:Calculating a time before 1970 (fails with negative seconds)计算 1970 年之前的时间(以负秒数失败)
【发布时间】:2011-05-02 02:09:57
【问题描述】:

我是ruby新手,当我学习ruby的Time类时(实际上我是按照VTC视频)我发现了一些我无法制作的东西,我想根据他的年龄来计算一个人的出生年份,

例如,当一个人告诉他的年龄是“20”,那么我应该计算他的出生年份。

class Person
    attr_accessor :name,:age,:year_born
    def initialize(name,age)
        @name=name
        @age=age
        @year_born=(Time.now - age*31556962).year
    end

    def days_alive
        @age*365
    end
end

在下面的代码中,除了

@year_born=(Time.now - age*31556962).year

我尝试时遇到错误

Person.new("name",43).year_born

上面写着:

ArgumentError: time must be positive
    ./person.rb:6:in `-'
    ./person.rb:6:in `initialize'

我知道 Time.now 会返回 1970 年的秒数,也就是说

(2011-1970)<43

所以Time.now-43*31556962 返回一个无效值,但我想知道如何实现我的要求?

【问题讨论】:

  • 一般性评论。一个人的出生年份不可能仅仅通过某个时间的年龄来判断。您需要更多信息(出生月份、日期,甚至在最坏的情况下最多几秒钟)才能做到这一点。
  • :) 感谢您的关注。其实并不是真正的应用,只是教程中的一个例子。
  • 我明白了。很好,你不会有麻烦。 (但这应该是教程中的一个错误。)
  • 我想是的。顺便说一句,在win系统中使用scite有什么经验吗?
  • 不幸的是,不是。我主要使用 linux。

标签: ruby time


【解决方案1】:

根据 Ruby 编程:

Time 是日期和日期的抽象 次。 Time 在内部存储为 秒数和微秒数 自 1970 年 1 月 1 日 00:00 开始 世界标准时间。在一些操作系统上,这 offset 允许为负数。还 请参阅页面上的日期库模块 742.(强调我的)

这意味着在某些操作系统上,偏移量不允许为负数。因此,我们任何 1970 年之前出生的老年人都可能会破坏您的代码。另外请记住,您实际上是在计算 number_of_seconds_per_year * age_in_years,这不是很准确。

【讨论】:

  • "在某些操作系统上,偏移量不允许为负" +100。那么就是说 Time 的方法 - 不安全?
  • 正确,从某种意义上说,如果在纪元之前的某个时间减去偏移量,您可能会遇到异常,具体取决于操作系统。
【解决方案2】:

为什么不这样做:

注意我正在使用

(时间.now.year - 年龄)

我有 year_born 作为一种方法。

class Person
    attr_accessor :name,:age
    def initialize(name,age)
        @name=name
        @age=age
    end

    def year_born
      (Time.now.year - age)
    end

    def days_alive
        @age*365
    end
end

但是,不要将年龄存储在您的数据库中(如果您要将其保存在您的数据库中)。只需保存出生日期即可。

【讨论】:

【解决方案3】:

问题是您使用的是Time,但应该使用DateDateTime,它们的范围更大。 Date 不知道时间,这可能更适合您的应用程序,因为您需要日粒度。

require 'date'
Date.today - 20 * 365 # => #<Date: 1991-05-07 (4896767/2,0,2299161)>
Date.today - 50 * 365 # => #<Date: 1961-05-14 (4874867/2,0,2299161)>
(Date.today - 50 * 365).year # => 1961

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多