2009-04-20 17 views
18

Soy un novato de RoR. He intentado muchas cosas, finalmente llegó a las siguientes:Ruby on Rails: ¿cómo mostrar una fecha en el formato que necesito? Conversión de AAAA-MM-DD HH: MM: SS UTC a MM/DD/AAAA

<td> 
<%= Date.strptime(request.baseline_start_date, "%Y-%M-%D %H:%M:%S %Z").strftime("%M/%D/%Y")%> 
</td> 

Pero esto también es darme un error:

$_ value need to be String (nil given) 

Pero sé que me da valor request.baseline_start_date (intentado imprimir por separado) No sé cuál dice como nulo.

¿Alguna sugerencia sobre cómo puedo lograr la conversión de formato?

Respuesta

1

Lo que he hecho es añadir un inicializador conversions.rb nombrado en config/inicializador Después de eso Añada una línea como la siguiente:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.update(:<name> => '<formatting>') 

A partir de ahí se puede hacer que su fecha y hora utilizando el formato con:

dateVar.to_s(:<name>) 

Hay una lista a la mano here de las fichas de formato

0

Muchas gracias por la respuesta. Mi problema es que el resultado parece ser una cadena y debo convertir la fecha en una cadena a otro formato.

Cuando miro la fecha almacenada en la base de datos (Oracle) es mm/dd/aa, pero cuando lo consigo, agrega la marca de tiempo y la zona horaria.

Intenté fijar el valor por defecto en la configuración \ environment.rb como ActiveSupport :: CoreExtensions :: Fecha :: :: Conversiones DATE_FORMATS.merge! ( : default => '% d% b% Y' ) Pero eso tampoco parece ayudar.

Al final, si acabo de obtener la cadena para convertir el formato de la zona horaria a mm/dd/aaaa, es suficiente.

3

Puede usar la función String # to_time (o Date # to_time) en ActiveSupport para convertir la cadena en un objeto Time (o Date). Luego use strftime como ya lo hizo.

+1

Este comentario me ayuda mucho, aquí está mi código que funcionó: 1.day.ago .to_date.strftime ("% m /% d /% Y") – KSolo

+0

La solución de KSolo funciona perfectamente para mí. –

27
Date.strptime(
    "2009-04-24 18:33:41 UTC", 
    "%Y-%m-%d %H:%M:%S %Z" 
).strftime("%m/%d/%Y") 
# => "04/24/2009" 

Creo que tal vez haya sacado las mayúsculas de sus cadenas de formato incorrectas.

+0

Esto también fue de gran ayuda, solo asegúrese de comprender el formato correcto de la fecha de entrada para strptime. Ese fue mi error original, pero una vez que lo hice, el comentario fue correcto. – KSolo

31

En Rails puede utilizar la función to_time en una cuerda para convertirlo en un objeto Date:

'2012-11-14 14:27:46'.to_time.strftime('%B %e at %l:%M %p') 

#=> "November 14 at 2:27 PM" 

Para una guía de referencia interactiva práctico, consulte a http://www.foragoodstrftime.com/

14

Comprobar la documentación de apoyo activo y ejemplos en: http://apidock.com/rails/ActiveSupport/CoreExtensions/DateTime/Conversions/to_formatted_s

Ejemplos

datetime = DateTime.civil(2007, 12, 4, 0, 0, 0, 0) # => Tue, 04 Dec 2007 00:00:00 +0000 

datetime.to_formatted_s(:db)   # => "2007-12-04 00:00:00" 
datetime.to_s(:db)      # => "2007-12-04 00:00:00" 
datetime.to_s(:number)     # => "20071204000000" 
datetime.to_formatted_s(:short)   # => "04 Dec 00:00" 
datetime.to_formatted_s(:long)   # => "December 04, 2007 00:00" 
datetime.to_formatted_s(:long_ordinal) # => "December 4th, 2007 00:00" 
datetime.to_formatted_s(:rfc822)  # => "Tue, 04 Dec 2007 00:00:00 +0000" 

O si realmente quiere personalizarlo, definir el ayudante como:

def custom_format(time) 
    Time::DATE_FORMATS[:w3cdtf] = lambda { |time| time.strftime("%Y-%m-%dT%H:%M:%S# {time.formatted_offset}") } 
end 
+0

La API oficial de rieles podría ser una mejor fuente http://api.rubyonrails.org/v2.3.8/classes/ActiveSupport/CoreExtensions/DateTime/Conversions.html – Btuman

+0

+1 para datetime.to_formatted_s (: db) –

Cuestiones relacionadas