Вычисление времени до 1970 года (не с отрицательными секундами) - PullRequest
1 голос
/ 02 мая 2011

Я новичок в ruby, и когда я изучаю класс Time в ruby ​​(фактически я слежу за видео 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 возвращает недопустимое значение, но я хочу знать, как реализовать мое требование?

Ответы [ 3 ]

3 голосов
/ 02 мая 2011

Согласно Ruby для программирования:

Time - это абстракция дат и раз. Time хранится внутри как количество секунд и микросекунд с эпохи 1 января 1970 г. 00:00 УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ. В некоторых операционных системах этот смещение может быть отрицательным. Также см. модуль библиотеки дат на странице 742. (выделение мое)

Это означает, что в некоторых операционных системах смещение не может быть отрицательным. Так что любой из нас, пожилых людей, которые родились до 1970 года, может взорвать ваш код. Также имейте в виду, что на самом деле вы вычисляете number_of_seconds_per_year * age_in_years, что будет не очень точно.

3 голосов
/ 02 мая 2011

почему бы не сделать это так:

обратите внимание, что я использую

(Time.now.year - возраст)

и что у меня год_борн как метод.

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

Однако не храните возраст в вашей БД (если вы собираетесь сохранить его в своей БД). Просто сохраните дату рождения.

1 голос
/ 02 мая 2011

Проблема в том, что вы используете Time, но должны использовать Date или DateTime, которые имеют больший диапазон.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...