Dada una marca de tiempo: cómo devolver la unidad y métrica más cercana, por ejemplo: 13 minutos, 1 hora

dada una marca de tiempo, me gustaría tener un método que devuelva la unidad correcta (segundos, horas, minutos) y la métrica correcta para esa unidad.

Ejemplos, para una marca de tiempo:

1 sec ago - Unit: SEC, Metric: 1
20 secs ago - Unit: SECS, Metric: 20
1 hour ago - Unit: HOUR, Metric: 1
3 hour ago - Unit: HOURS, Metric: 3
25 hours ago - Unit: DAY, Metric: 1
50 hours ago - Unit: DAYS, Metric: 2

Para este método solo necesito ir a soporte, segundos, horas y días. No meses. Ideas?

preguntado el 16 de mayo de 11 a las 19:05

1 Respuestas

La mayor parte de la lógica ya está como ayudante en Rails: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words

Algo como esto tal vez:

def palabras_y_unidades (from_time, to_time = 0)

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_in_minutes = (((to_time - from_time) .abs) / 60) .round distance_in_seconds = ((to_time - from_time) .abs) .round

case distance_in_minutes
  when 0..1

    case distance_in_seconds
      when 0..59   then {:metric => distance_in_seconds, :unit => 'SEC'}
      else             {:metric => 1, :unit => 'MIN'}
    end

  when 2..44           then {:metric => distance_in_minutes, :unit => 'MIN'}
  when 45..89          then {:metric => 1, :unit => 'HOUR'}
  when 90..1439        then {:metric => (distance_in_minutes.to_f / 60.0).round, :unit => 'HOUR'}
  when 1440..2529      then {:metric => 1, :unit => 'DAY'}
  when 2530..43199     then {:metric => (distance_in_minutes.to_f / 1440.0).round, :unit => 'DAY'}
  else
    raise WayToLongError
end

final

contestado el 16 de mayo de 11 a las 23:05

Gracias, pero ¿cómo se accede a las variables de unidad: metric: dada esta función? - Un aprendiz

Obtienes un hash, así que algo como myvar = words_and_units (Time.now) => {: metric => 1,: unit => 'SEC'} para que puedas usar myvar [: metric] o myvar [: unit] - John Paul Ashenfelter

O puede usar métodos convenientes para extraerlo como def metric (from_time) words_and_units (from_time) [: metric] end para resumirlo bien y ajustado - John Paul Ashenfelter

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.