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

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

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"

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.


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)


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.