2011-11-17 8 views
13

Tengo este código que convierte una matriz de cadenas de fechas de un formato de 17-nov-2011 al 17/11/11 :Convierta un formato de fecha de cadena de "17-nov-2011" a "17/11/11"

def date_convert dates 
    months = { 'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 
      'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 
      'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12 } 
    new_dates = [] 
    dates.each do |date| 
    date_split = date.split('-') 
    month = months[date_split[1]] 
    day = date_split[0] 
    year = date_split[2][-2, 2] 
    new_dates.push ("#{month}/#{day}/#{year}") 
    end 
    new_dates 
end 

¿Existe alguna forma mejor y posiblemente integrada para hacer esta conversión con Ruby? Estoy aprendiendo Ruby por lo que cualquier otro enfoque sería muy apreciado.

+2

de Ruby [ 'date'] (http: // www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/index.html) y ['Time'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc /time/rdoc/index.html) las bibliotecas están muy completas. Ambos merecen tomarse el tiempo para saber qué pueden hacer; La fecha maneja rangos mayores que el Tiempo. –

+1

Para los momentos en que 'parse' falla o se confunde, debe ver explícitamente [' DateTime.strptime'] (http://ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html # method-c-strptime) – Phrogz

+0

nota: array vacío + each + push = map – tokland

Respuesta

20

Utilice las funciones incorporadas Time.parse y Time#strftime.

require 'time' 
time = Time.parse("17-Nov-2011") 
time.strftime("%m/%d/%y") 
# => "11/17/11" 
+4

Encadenaría '.strftime()' al análisis, pero esa es una diferencia menor. –

+0

usando Time.parse ... returned: método indefinido 'parse 'para Time: Class (NoMethodError)? –

+3

¿'Necesitas' tiempo '? –

4

Ruby tiene un conjunto bastante robusta de las funciones de fecha y hora, echa un vistazo a la clase Date.

Date.parse("17-Nov-2011").strftime('%m/%d/%y') 
9

Con Date#strftime puede formatear una fecha. Date.strptime le permite una acción "inversa": cree una fecha a partir de una cadena.

Cuando se combinan tanto, se obtiene el resultado:

puts Date.strptime('17-Nov-2011', '%d-%b-%Y').strftime('%m/%d/%y') 

Cada % -Parámetros es una parte de la cadena de fecha. Es necesario:

Para analizar la cadena de fecha:

  • % d: número del día (17)
  • % b: Mes con tres letras (NOV)
  • % A: año con 4 dígitos (2011)

para la creación de la cadena:

  • % m: Mes (11)
  • % d: número del día (17)
  • % y: Año con 2 dígitos (11)
+0

Sabía que Ruby podía adivinar cómo analizar una cadena de fecha, pero no sabía que podía decir el formato, que es exactamente lo que tenía que hacer. ¡Gracias! –

Cuestiones relacionadas