Расчет расстояния между двумя - PullRequest
1 голос
/ 06 августа 2009

Я пытаюсь сделать «лучше» distance_of_time_in_words для рельсов, и до сих пор у меня есть это: http://github.com/radar/dotiw.

Однако, в настоящий момент он задыхается на месяцы + годы, как показаноспецификации.Я в полной растерянности!Справка?

Код, добавленный Pax, так что никто не должен искать через github:

module ActionView
  module Helpers
    module DateHelper
      def distance_of_time_in_words_hash(from_time, to_time)
        output = HashWithIndifferentAccess.new
        from_time = from_time.to_time if from_time.respond_to?(:to_time)
        to_time = to_time.to_time if to_time.respond_to?(:to_time)
        distance = from_time - to_time

        # Get a positive number.
        distance *= -1 if distance < 0

        while distance > 0
          if distance > 100000000000000
          elsif distance >= 31449600
            output[I18n.t(:years, :default => "years")], distance = 
              distance.divmod(31449600)
          elsif distance >= 2419200
            output[I18n.t(:months, :default => "months")], distance = 
              distance.divmod(2419200)
          elsif distance >= 604800
            output[I18n.t(:weeks, :default => "weeks")], distance = 
              distance.divmod(604800)
          elsif distance >= 86400
            output[I18n.t(:days, :default => "days")], distance =
              distance.divmod(86400)
          elsif distance >= 3600
            output[I18n.t(:hours, :default => "hours")], distance = 
              distance.divmod(3600)
          elsif distance >= 60
            output[I18n.t(:minutes, :default => "minutes")], distance = 
              distance.divmod(60)
          else
            output[I18n.t(:seconds, :default => "seconds")] = distance.to_i
            distance = 0
          end
        end
        output
      end

      def distance_of_time_in_words(from_time, to_time, include_seconds = false, 
          options = {}, output_options = {})

        hash = distance_of_time_in_words_hash(from_time, to_time)
        hash.delete(:seconds) if !include_seconds

        # Remove all the values that are nil.
        time_measurements = [
          I18n.t(:years, :default => "years"),
          I18n.t(:months, :default => "months"),
          I18n.t(:weeks, :default => "weeks"),
          I18n.t(:days, :default => "days"),
          I18n.t(:hours, :default => "hours"),
          I18n.t(:minutes, :default => "minutes"),
          I18n.t(:seconds, :default => "seconds")].delete_if do |key|
            hash[key].nil?
        end

        output = []
        time_measurements.each do |key|
          name = hash[key] > 1 ? key : key.singularize
          output += ["#{hash[key]} #{name}"]
        end

        output.to_sentence(output_options)
      end
    end
  end
end

Ответы [ 2 ]

2 голосов
/ 06 августа 2009

Похоже, что вы пытаетесь получить разницу во времени в единицах всех применимых единиц (то есть "2 года, 4 месяца, 7 дней" вместо "2 года", которые дает Rails 'distance_of_time_in_words)?

Если это так, отметьте В Rails отображайте время между двумя датами на английском языке , еще один вопрос о отображении разницы во времени. Мой ответ должен дать вам хорошую отправную точку для того, что вы, похоже, пытаетесь сделать, и нетрудно расширить метод, включив часы, минуты и секунды.

2 голосов
/ 06 августа 2009

Мы тоже в полной растерянности. Возможно, вы могли бы сделать нашу жизнь проще:

  • (1) размещение кода (он не такой уж большой) [забудь, я сделал это для тебя].
  • (2) скажите нам точно , каким должно быть правильное поведение (желаемый результат).
  • (3) сообщите нам поведение, которое вы получаете (пример фактического результата).

Тогда, возможно, мы сможем сделать лучше.

Одна вещь, которую я сразу заметил: не 2 419 200 секунд в любом месяце, кроме февраля (и то только в не високосных годах). Аналогично, ни один год не имеет 364 дня.

Я думаю, вам нужно переосмыслить способ вычисления интервалов.

Предполагая, что ваша "словесная" версия длительности может справиться с небольшой неточностью, как минимум вы должны использовать средние значения для этих цифр (принимая во внимание, что год равен 365,2425 дням, что должно быть достаточно близко для ваших целей ):

  • один год составляет 31 556 952 секунд.
  • один месяц составляет 2629746 секунд (простое деление на 12).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...