2009-07-10 5 views
94

Ho una colonna datetime in db che voglio trasformare in una data semplice quando la mostro agli utenti.Transform DateTime in Simple Date in Ruby on Rails

Come posso farlo?

 
def shown_date 
    # to_date does not exist, but is what I am looking for 
    self.date || self.exif_date_time_original.to_date 
end 
+0

Avete voglia di formattarlo? –

+0

No, vorrei creare un oggetto Date – collimarco

+0

Ooops .. domanda stupida! to_date ESISTE! Spiacente :( – collimarco

risposta

131

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 
+0

È un peccato che '.to_date()' non sia presente nel ruby ​​standard, quindi dobbiamo fare una soluzione alternativa. Convertire la conversione da DateTime a Date con il timezone corretto attraverso la stringa (!!!) non è elegante. le parti interne di DateTime e Date non sono facili. Semplicemente furibonde, ignorate! :-) – Notinlist

+0

@Notinlist l'intera gamma di binari è scritta in Ruby, quindi potreste probabilmente cercare sull'api delle rotaie per trovare il metodo to_date(). Questo ti dirà il modulo in cui si trova, che potresti includere per gli oggetti DateTime nel tuo codice –

+9

.to_date è stato aggiunto in Ruby 1.9.2. – joshaidan

53

Ciao :) collimarco è possibile utilizzare rubino metodo strftime per creare ur proprio display data/ora.

time.strftime (stringa) => 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" 
+0

Per la documentazione: http://apidock.com/rails/ActiveSupport/TimeWithZone/strftime –

16

In Ruby 1.9.2 e sopra hanno aggiunto una funzione .to_date 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.

+0

Solo se si include il supporto attivo come specificato. –

+3

No, in Ruby 1.9.2 e versioni successive non è necessario includere ActiveSupport. Come puoi vedere nella mia risposta, ho incluso un collegamento ai principali documenti di Ruby stdlib per 1.9.2. – joshaidan

0

Provare prima a convertire la voce in una stringa. Finché il tipo di colonna del database è una data, sarà formata come una data.

self.date || self.exif_date_time_original.to_s

0

Per vecchio Rubino (1.8.x):

myDate = Date.parse(myDateTime.to_s)