2009-07-10 5 views
94

J'ai une colonne datetime en db que je veux transformer en une date simple quand je la montre aux utilisateurs.Transformer DateTime en simple Date dans Ruby on Rails

Comment puis-je faire cela?

 
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

Voulez-vous simplement formater? –

+0

Non, je voudrais créer un objet Date – collimarco

+0

Ooops .. question stupide! todate DO EXISTE! Désolé :( – collimarco

Répondre

131

DateTime#to_date existe avec 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

Il est dommage que '.to_date()' ne soit pas présent dans ruby ​​standard donc nous devons faire une solution de contournement.La conversion de DateTime en Date avec une chaîne de temps correcte (!!!) n'est pas élégante. les internes du DateTime et de la Date ne sont pas faciles, juste saccadés, ignorez! :-) – Notinlist

+0

@Notinlist l'intégralité des rails est écrite en Ruby, donc vous pouvez probablement regarder sur les rails api pour trouver la méthode to_date(). Cela vous indiquera le module dans lequel il est, que vous pourriez ensuite inclure pour les objets DateTime dans votre code –

+9

.to_date a été ajouté dans Ruby 1.9.2. – joshaidan

53

Bonjour collimarco :) vous pouvez utiliser Ruby méthode strftime pour créer ur propre affichage date/heure.

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

Pour la documentation: http://apidock.com/rails/ActiveSupport/TimeWithZone/strftime –

16

Dans Ruby 1.9.2 et au-dessus, ils ont ajouté une fonction .to_date à DateTime:

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

Cette méthode d'instance ne semble pas être présente dans les versions antérieures comme 1.8.7.

+0

Seulement si vous incluez le support actif comme je l'ai détaillé. –

+3

Non, dans Ruby 1.9.2 et supérieur, vous n'avez pas besoin d'inclure ActiveSupport. Comme vous pouvez le voir dans ma réponse, j'ai inclus un lien vers le document de base de Ruby stdlib pour 1.9.2. – joshaidan

0

Essayez de convertir l'entrée en chaîne en premier. Tant que le type de colonne de base de données est une date, il sera formalisé en tant que date.

self.date || self.exif_date_time_original.to_s

0

Pour vieux Ruby (1.8.x):

myDate = Date.parse(myDateTime.to_s)