Ubah DateTime menjadi Date sederhana di Ruby on Rails

114

Saya memiliki kolom datetime dalam db yang ingin saya ubah menjadi tanggal sederhana ketika saya menunjukkannya kepada pengguna.

Bagaimana saya bisa melakukan itu?

def ditampilkan_tanggal
  # to_date tidak ada, tapi itulah yang saya cari
  self.date || self.exif_date_time_original.to_date
akhir
collimarco
sumber
Apakah Anda hanya ingin memformatnya?
Peer Allan
Tidak, saya ingin membuat objek Tanggal
collimarco
Ups .. pertanyaan bodoh! to_date JANGAN ADA! Maaf :(
collimarco

Jawaban:

165

DateTime#to_date ada dengan 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
sumber
Sayang sekali .to_date()tidak ada dalam ruby ​​standar jadi kami harus melakukan solusi. Mengonversi dari DateTime ke Date dengan string palung zona waktu yang benar (!!!) tidaklah elegan. Memahami bagian dalam DateTime dan Tanggal tidaklah mudah. Hanya mengamuk, abaikan! :-)
Catat
@Notinlist keseluruhan rel ditulis di Ruby, jadi Anda mungkin bisa melihat api rel untuk menemukan metode to_date (). Itu akan memberi tahu Anda modulnya, yang kemudian dapat Anda sertakan untuk objek DateTime dalam kode Anda
Eric Hu
9
.to_date telah ditambahkan di Ruby 1.9.2.
joshaidan
7
@Michael kamu salah. Berikut adalah dokumentasi untuk pustaka standar Ruby 1.9.2 yang mendokumentasikan fungsi to_date. ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/…
joshaidan
60

Halo collimarco :) Anda dapat menggunakan metode ruby strftime untuk membuat tampilan tanggal / waktu Anda sendiri.

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"
gkrdvl.dll
sumber
20

Di Ruby 1.9.2 dan yang lebih baru, mereka menambahkan fungsi .to_date ke DateTime:

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

Metode instance ini tampaknya tidak ada di versi sebelumnya seperti 1.8.7.

joshaidan
sumber
Hanya jika Anda menyertakan dukungan aktif seperti yang saya jelaskan.
Michael Durrant
3
Tidak, di Ruby 1.9.2 dan yang lebih baru Anda tidak perlu menyertakan ActiveSupport. Seperti yang Anda lihat di jawaban saya, saya menyertakan tautan ke dokumen inti Ruby stdlib untuk 1.9.2.
joshaidan
2

Untuk Ruby lama (1.8.x):

myDate = Date.parse(myDateTime.to_s)
Lassi
sumber
0

Coba ubah entri menjadi string terlebih dahulu. Selama tipe kolom database adalah tanggal maka akan diformat sebagai tanggal.

self.date || self.exif_date_time_original.to_s

CrazyCoderMonkey
sumber