Transformez DateTime en date simple dans Ruby on Rails

114

J'ai une colonne datetime dans db que je veux transformer en une simple date lorsque je la montre aux utilisateurs.

Comment puis je faire ça?

def shown_date
  # to_date n'existe pas, mais c'est ce que je recherche
  self.date || self.exif_date_time_original.to_date
fin
collimarco
la source
Voulez-vous simplement le formater?
Peer Allan
Non, je voudrais créer un objet Date
collimarco
Oups ... question stupide! to_date EXISTE! Désolé :(
collimarco

Réponses:

165

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
Ryan McGeary
la source
C'est dommage que ce .to_date()ne soit pas présent dans le rubis standard, nous devons donc contourner le problème. La conversion de DateTime en Date avec une chaîne de creux de fuseau horaire correcte (!!!) n'est pas élégante. Comprendre les éléments internes du DateTime et de la Date n'est pas facile. Juste déchaîné, ignorez! :-)
Notinlist
@Notinlist l'intégralité des rails est écrite en Ruby, donc vous pourriez probablement regarder sur l'API de rails pour trouver la méthode to_date (). Cela vous indiquera le module dans lequel il se trouve, que vous pourrez ensuite inclure pour les objets DateTime dans votre code
Eric Hu
9
.to_date a été ajouté dans Ruby 1.9.2.
joshaidan
7
@Michael vous vous trompez. Voici la documentation de la bibliothèque standard de Ruby 1.9.2 documentant la fonction to_date. ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/…
joshaidan
60

Bonjour collimarco :) vous pouvez utiliser la méthode ruby strftime pour créer votre propre affichage de la date / heure.

time.strftime (chaîne) => chaîne

  %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
la source
20

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 la 1.8.7.

Joshaidan
la source
Seulement si vous incluez un support actif comme je l'ai détaillé.
Michael Durrant
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 la documentation principale de Ruby stdlib pour la version 1.9.2.
joshaidan
2

Pour l'ancien Ruby (1.8.x):

myDate = Date.parse(myDateTime.to_s)
Lassi
la source
0

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

self.date || self.exif_date_time_original.to_s

CrazyCoderMonkey
la source