2010-05-30 41 views
24

Tôi đang triển khai ứng dụng Facebook và sử dụng AJAX/JSON.đường ray ngày tháng với json

Tuy nhiên, JSON cấu trúc được trả lại có định dạng này 2010-05-30T06:14:00Z.

Tôi đang gọi Game.all.to_json trong hoạt động của bộ điều khiển.

Làm cách nào để chuyển đổi chúng sang định dạng ngày bình thường?

Việc làm điều đó dễ dàng hơn từ phía máy chủ hoặc phía máy khách bằng cách sử dụng fbjs? Có rất nhiều lỗi với fbjs.

Vì vậy, tôi muốn sử dụng giải pháp từ Server side sử dụng (Active Records). Giống như chuyển đổi dữ liệu trước khi gửi các cấu trúc JSON.

+0

Điều đó hoạt động: http://stackoverflow.com/questions/5370061/format-date-time-in-find-operation-in-rails-3/7479550#7479550 – hipertracker

Trả lời

47

Cách tôi thêm định dạng tùy chỉnh của riêng mình vào json mà tôi đã quay trở lại là thêm miếng vá khỉ vào lớp ActiveSupport TimeWithZone.

Thêm một tập tin trong thư mục config/initializers với các nội dung sau:

class ActiveSupport::TimeWithZone 
    def as_json(options = {}) 
     strftime('%Y-%m-%d %H:%M:%S') 
    end 
end 
+0

Điều này phù hợp với tôi, nhưng bây giờ tôi ' m cố gắng để làm một điều tương tự cho một đối tượng Date (trả về bằng cách sử dụng date_select). Tôi đã thử thay thế ActiveSupport :: TimeWithZone với ActiveSupport :: Date, nhưng không có niềm vui. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn. – Snips

+3

Có thể hữu ích khi thêm% z cho múi giờ. – tbeseda

+0

@Geekygecko Tôi đã bình chọn câu trả lời của bạn. Tôi đã sử dụng cách tiếp cận này và nó hoạt động tốt cho một trường datetime liên kết với một Mô hình, không phải cho trường datetime từ bảng khác trong một truy vấn AREL với các phép nối. – GeorgeW

1

Chắc chắn dễ dàng hơn để thực hiện điều đó ở phía máy chủ. Bạn có thể làm một regex gsub để đặt nó vào định dạng bạn muốn, hoặc một time.strftime, sau đó tạo ra json của bạn với chuỗi đó.

7

Với múi giờ làm việc trong tất cả các trình duyệt chính và IE7 +:

class ActiveSupport::TimeWithZone 
    def as_json(options = {}) 
    strftime('%Y/%m/%d %H:%M:%S %z') 
    end 
end 
1
Time.parse <datetime> 

simples.

2

Nếu bạn muốn làm điều này với client-side javascript, bạn có thể phân tích ngày cá nhân với một cái gì đó như thế này:

prettyDate = function(dateString) { 
    var day, formatted, jsDate, month; 

    jsDate = new Date(dateString); 
    day = jsDate.getMonth() + 1 < 10 ? "0" + (jsDate.getMonth() + 1) : "" + (jsDate.getMonth() + 1); 
    month = jsDate.getDate() < 10 ? "0" + (jsDate.getDate()) : "" + (jsDate.getDate()); 

    formatted = "" + day + "/" + month + "/" + (jsDate.getFullYear()); 
    return formatted; 
}; 

Bạn sẽ cần một số mã bổ sung nếu bạn cần phải định dạng thời gian của khóa học.

2

Bạn có thể ghi đè phương pháp as_json trong mô hình của bạn như:

class Game 
    def as_json(options = {}) 
    super.merge(time: time.strftime('%d.%m.%Y %H:%M:%S')) 
    end 
end 
0

Rails hiện nay có phương pháp .as_json trên đối tượng DateTime. Cuộc sống dễ dàng hơn.

Các vấn đề liên quan