0

現在、2 つの日付を減算するメソッドを作成しようとしています。見た目は次のとおりです:(成熟は未来の時間です)

  def time_remaining
    # If validated, return time between now and number of days from validation.
    if self.is_validated?
      return (self.maturity > Time.now) ? (self.maturity - Time.now) : 0
    # If not validated, return number of days converted in time
    else
      return self.nb_days.nil? ? 0 : self.nb_days.days
    end
  end

そして私のビューでは、これをやっています:

distance_of_time_in_words(project.time_remaining)

これは機能しますが、実際にやろうとしていることではありません。減算の結果が1日未満の場合は時間数を取得し、減算の結果が1日未満の場合は分数を取得しますは 1 時間未満であり、結果が 1 日を超える場合は日数を取得します。

成熟度は次の形式で表されます: Wed, 27 Nov 2013 12:42:09 UTC +00:00. どうすればそれができるかについて、少なくともヒントを教えてください。

編集 :

私はこのようなことを試しましたが、それは本当に厄介です:

def time_remaining
    # If validated, return time between now and number of days from validation.
    if self.is_validated?
      if (self.maturity > Time.now)
        if ((self.maturity - Time.now)/1.day < 1)
          return (self.maturity - Time.now)/1.day.
        elsif ((self.maturity - Time.now) < 1.hour)
          return (self.maturity - Time.now)/1.min
        else
          return (self.maturity - Time.now)
        end
      else
        0
      end
    # If not validated, return number of days converted in time
    else
      return self.nb_days.nil? ? 0 : self.nb_days.days
    end
  end

ここを外すのがポイントですdistance_of_time_in_words

解決策: @Rafał Cieślak と gem time_diff に感謝します。これが私がやったことです:

  def remaining_time (project)
    if project.is_validated?
      if ((project.maturity - Time.now)/1.day >= 1)
        result = Time.diff(project.maturity, Time.now, '%d')
        return result[:diff]
      elsif ((project.maturity - Time.now)/1.hour > 1 && (project.maturity - Time.now)/1.hour < 24)
        result = Time.diff(project.maturity, Time.now, '%H')
        return result[:diff]
      elsif ((project.maturity - Time.now)/1.hour < 1)
        result = Time.diff(project.maturity, Time.now, '%N')
        return result[:diff]
      end
    else
      return project.nb_days.nil? ? 0 : project.nb_days.days
    end
  end
4

1 に答える 1

2

これは私が本当に素早くハッキングしたものです。time_diff gemをインストールし、次のメソッドをヘルパーとして使用する必要があります (モデル内ではありません)。

def time_remaining(time_start, time_end)
  diff_hash = Time.diff(time_start, time_end)
  diff_hash.delete :diff
  output = []

  diff_hash.each do |key, value|
    output.push(pluralize(value, key.to_s)) if value > 0
  end

  output.join(', ')
end

例:

>> time_remaining 2.days.ago.change(min: 58, hour: 15), Time.now
=> "1 day, 20 hours, 19 minutes, 24 seconds"
>> time_remaining 34.minutes.ago.change(sec: 15), Time.now
=> "33 minutes, 53 seconds"
于 2013-09-05T12:19:33.760 に答える