Trasforma DateTime in un semplice Date in Ruby on Rails


114

Ho una colonna datetime in db che voglio trasformare in una semplice data quando la mostro agli utenti.

Come lo posso fare?

def shown_date
  # to_date non esiste, ma è quello che sto cercando
  self.date || self.exif_date_time_original.to_date
fine

Vuoi solo formattarlo?
Peer Allan

No, vorrei creare un oggetto Date
collimarco

Ops .. domanda stupida! to_date ESISTE! Scusa :(
collimarco

Risposte:


165

DateTime#to_date esiste 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

È un peccato che .to_date()non sia presente nel rubino standard, quindi dobbiamo fare una soluzione alternativa. La conversione da DateTime a Date con la stringa corretta del fuso orario (!!!) non è elegante. Comprendere gli interni di DateTime e Date non è facile. Solo furioso, ignora! :-)
Noninlist

@Notinlist la totalità di rails è scritta in Ruby, quindi potresti probabilmente guardare sull'api rails per trovare il metodo to_date (). Questo ti dirà il modulo in cui si trova, che potresti quindi includere per gli oggetti DateTime nel tuo codice
Eric Hu

9
.to_date è stato aggiunto in Ruby 1.9.2.
joshaidan

7
@Michael ti sei sbagliato. Ecco la documentazione per la libreria standard di Ruby 1.9.2 che documenta la funzione to_date. ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/…
joshaidan

60

Ciao collimarco :) puoi usare il metodo ruby strftime per creare la tua visualizzazione di data / ora.

time.strftime (string) => string

  %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"

20

In Ruby 1.9.2 e versioni successive hanno aggiunto una funzione .to_date a DateTime:

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

Questo metodo di istanza non sembra essere presente nelle versioni precedenti come 1.8.7.


Solo se includi il supporto attivo come ho spiegato.
Michael Durrant

3
No, in Ruby 1.9.2 e versioni successive non è necessario includere ActiveSupport. Come puoi vedere nella mia risposta, ho incluso un collegamento alla documentazione principale di Ruby stdlib per 1.9.2.
joshaidan

2

Per il vecchio Ruby (1.8.x):

myDate = Date.parse(myDateTime.to_s)


0

Prova prima a convertire la voce in una stringa. Finché il tipo di colonna del database è una data, verrà formattato come una data.

self.date || self.exif_date_time_original.to_s

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.