Ruby on Rails'de DateTime'ı basit Date'e dönüştürün


114

Kullanıcılara gösterdiğimde basit bir tarihe dönüştürmek istediğim db'de bir tarih saat sütunum var.

Bunu nasıl yapabilirim?

def shown_date
  # to_date mevcut değil ama aradığım şey bu
  self.date || self.exif_date_time_original.to_date
son

Sadece biçimlendirmek mi istiyorsunuz?
Peer Allan

Hayır, bir Date nesnesi oluşturmak istiyorum
collimarco

Ooops .. aptalca soru! to_date VAR OLUN! Üzgünüz :(
collimarco

Yanıtlar:


165

DateTime#to_date ActiveSupport ile mevcut:

$ 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

.to_date()Standart yakutta bulunmayan bir utançtır, bu yüzden geçici bir çözüm yapmalıyız. Doğru saat dilimi çukur dizesi (!!!) ile DateTime'dan Date'e dönüştürmek zarif değildir. DateTime ve Date'in iç kısımlarını anlamak kolay değildir. Sadece öfkeli, görmezden gelin! :-)
Notinlist

@Notinlist rayların tamamı Ruby'de yazılmıştır, bu nedenle to_date () yöntemini bulmak için muhtemelen raylar api'sine bakabilirsiniz. Bu size içinde bulunduğu modülü söyleyecek ve daha sonra kodunuza DateTime nesneleri için ekleyebileceksiniz
Eric Hu 19'11

9
.to_date Ruby 1.9.2'ye eklendi.
joshaidan

7
@Michael yanılıyorsunuz. Burada, to_date işlevini belgeleyen Ruby 1.9.2'nin standart kitaplığı için belgeler bulunmaktadır. ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/…
joshaidan

60

Merhaba collimarco :) Kendi tarih / saat ekranınızı oluşturmak için ruby strftime yöntemini kullanabilirsiniz .

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

Ruby 1.9.2 ve üzerinde, DateTime'a bir .to_date işlevi eklediler:

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

Bu örnek yöntemi, 1.8.7 gibi önceki sürümlerde mevcut görünmüyor.


Sadece detaylandırdığım şekilde aktif destek eklerseniz.
Michael Durrant 05

3
Hayır, Ruby 1.9.2 ve üzeri sürümlerde ActiveSupport'u eklemenize gerek yoktur. Cevabımda görebileceğiniz gibi, 1.9.2 için çekirdek Ruby stdlib belgelerine bir bağlantı ekledim.
joshaidan

2

Eski Ruby için (1.8.x):

myDate = Date.parse(myDateTime.to_s)


0

Önce girişi bir dizeye dönüştürmeyi deneyin. Veritabanı sütun türü bir tarih olduğu sürece tarih olarak biçimlendirilecektir.

self.date || self.exif_date_time_original.to_s

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.