Transforme DateTime en una fecha simple en Ruby on Rails

114

Tengo una columna de fecha y hora en la base de datos que quiero transformar en una fecha simple cuando se la muestro a los usuarios.

¿Cómo puedo hacer eso?

def fecha_de_mostrada
  # to_date no existe, pero es lo que estoy buscando
  self.date || self.exif_date_time_original.to_date
final
collimarco
fuente
¿Solo quieres formatearlo?
Peer Allan
No, me gustaría crear un objeto Date
collimarco
Vaya ... pregunta estúpida! to_date ¡EXISTE! Lo siento :(
collimarco

Respuestas:

165

DateTime#to_date existe con ActiveSupport:

$ irb
>> DateTime.new.to_date
NoMethodError: undefined method 'to_date' for #<DateTime: -1/2,0,2299161>
    from (irb):1

>> require 'active_support/core_ext'
=> true

>> DateTime.new.to_date
=> Mon, 01 Jan -4712
Ryan McGeary
fuente
Es una pena que .to_date()no esté presente en el rubí estándar, así que tenemos que hacer una solución. La conversión de DateTime a Date con una cadena de zona horaria correcta (!!!) no es elegante. Comprender los aspectos internos de DateTime y Date no es fácil. ¡Solo arrasando, ignora! :-)
Notinlist
@Notinlist la totalidad de los rieles está escrito en Ruby, por lo que probablemente podría buscar en la api de rieles para encontrar el método to_date (). Eso le dirá en qué módulo se encuentra, que luego podría incluir para los objetos DateTime en su código
Eric Hu
9
.to_date se agregó en Ruby 1.9.2.
Joshaidan
7
@Michael, estás equivocado. Aquí está la documentación de la biblioteca estándar de Ruby 1.9.2 que documenta la función to_date. ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/…
joshaidan
60

Hola collimarco :) puedes usar el método ruby strftime para crear tu propia visualización de fecha / hora.

time.strftime (cadena) => cadena

  %a - The abbreviated weekday name (``Sun'')
  %A - The  full  weekday  name (``Sunday'')
  %b - The abbreviated month name (``Jan'')
  %B - The  full  month  name (``January'')
  %c - The preferred local date and time representation
  %d - Day of the month (01..31)
  %H - Hour of the day, 24-hour clock (00..23)
  %I - Hour of the day, 12-hour clock (01..12)
  %j - Day of the year (001..366)
  %m - Month of the year (01..12)
  %M - Minute of the hour (00..59)
  %p - Meridian indicator (``AM''  or  ``PM'')
  %S - Second of the minute (00..60)
  %U - Week  number  of the current year,
          starting with the first Sunday as the first
          day of the first week (00..53)
  %W - Week  number  of the current year,
          starting with the first Monday as the first
          day of the first week (00..53)
  %w - Day of the week (Sunday is 0, 0..6)
  %x - Preferred representation for the date alone, no time
  %X - Preferred representation for the time alone, no date
  %y - Year without a century (00..99)
  %Y - Year with century
  %Z - Time zone name
  %% - Literal ``%'' character

   t = Time.now
   t.strftime("Printed on %m/%d/%Y")   #=> "Printed on 04/09/2003"
   t.strftime("at %I:%M%p")            #=> "at 08:56AM"
gkrdvl
fuente
20

En Ruby 1.9.2 y superior, agregaron una función .to_date a DateTime:

http://ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/DateTime.html#method-i-to_date

Este método de instancia no parece estar presente en versiones anteriores como 1.8.7.

Joshaidan
fuente
Solo si incluye apoyo activo como detallé.
Michael Durrant
3
No, en Ruby 1.9.2 y superior no es necesario incluir ActiveSupport. Como puede ver en mi respuesta, incluí un enlace a los documentos principales de Ruby stdlib para 1.9.2.
Joshaidan
2

Para Ruby antiguo (1.8.x):

myDate = Date.parse(myDateTime.to_s)
Lassi
fuente
0

Intente convertir la entrada en una cadena primero. Siempre que el tipo de columna de la base de datos sea una fecha, se formateará como una fecha.

self.date || self.exif_date_time_original.to_s

CrazyCoderMonkey
fuente