Chuyển đổi DateTime thành Date đơn giản trong Ruby on Rails


114

Tôi có một cột ngày giờ trong db mà tôi muốn chuyển đổi thành một ngày đơn giản khi tôi hiển thị nó cho người dùng.

Làm thế nào tôi có thể làm điều đó?

def show_date
  # to_date không tồn tại, nhưng là thứ tôi đang tìm kiếm
  self.date || self.exif_date_time_original.to_date
kết thúc

Bạn chỉ muốn định dạng nó?
Đồng đẳng Allan

Không, tôi muốn tạo một đối tượng Date
collimarco

Rất tiếc .. câu hỏi ngu ngốc! to_date HÃY TỒN TẠI! Xin lỗi :(
collimarco

Câu trả lời:


165

DateTime#to_date có tồn tại với 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

Thật tiếc .to_date()là nó không có trong ruby ​​tiêu chuẩn nên chúng tôi phải giải quyết. Chuyển đổi từ DateTime sang Date với chuỗi đáy múi giờ chính xác (!!!) là không thanh lịch. Việc hiểu nội dung của DateTime và Date không phải là dễ dàng. Chỉ hung hăng, mặc kệ! :-)
Notinlist

@Notinlist toàn bộ rails được viết bằng Ruby, vì vậy bạn có thể xem api rails để tìm phương thức to_date (). Điều đó sẽ cho bạn biết các mô-đun nó trong, mà sau đó bạn có thể bao gồm cho các đối tượng DateTime trong mã của bạn
Eric Hồ

9
.to_date đã được thêm vào Ruby 1.9.2.
joshaidan

7
@Michael bạn không chính xác. Đây là tài liệu cho thư viện chuẩn của Ruby 1.9.2 ghi lại hàm to_date. ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/…
joshaidan

60

Xin chào collimarco :) bạn có thể sử dụng phương thức ruby strftime để tạo hiển thị ngày / giờ của riêng bạn.

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

Trong Ruby 1.9.2 trở lên, họ đã thêm một hàm .to_date vào DateTime:

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

Phương thức thể hiện này dường như không xuất hiện trong các phiên bản trước đó như 1.8.7.


Chỉ khi bạn bao gồm hỗ trợ tích cực như tôi đã nêu chi tiết.
Michael Durrant

3
Không, trong Ruby 1.9.2 trở lên, bạn không cần phải bao gồm ActiveSupport. Như bạn có thể thấy trong câu trả lời của tôi, tôi đã bao gồm một liên kết đến các tài liệu Ruby stdlib cốt lõi cho 1.9.2.
joshaidan

2

Đối với Ruby cũ (1.8.x):

myDate = Date.parse(myDateTime.to_s)


0

Trước tiên, hãy thử chuyển đổi mục nhập thành một chuỗi. Miễn là kiểu cột cơ sở dữ liệu là ngày thì nó sẽ được định dạng là ngày.

self.date || self.exif_date_time_original.to_s

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.