2012-02-03 37 views
10

Tôi lưu trữ ngày theo định dạng DATETIME trong cơ sở dữ liệu MySQL. Khi một mô hình được tìm nạp từ cơ sở dữ liệu, ngày tháng (theo định dạng DATETIME) được chuyển đổi thành các đối tượng ngày trong phương thức khởi tạo của mô hình. Càng xa càng tốt.Làm cách nào để xử lý các ngày trong Backbone?

Khi mô hình được lưu vào máy chủ, các đối tượng ngày cần được chuyển đổi về định dạng DATETIME để mã phía máy chủ diễn giải đúng ngày. Tôi đã sử dụng tất cả các loại hackery để làm điều này, nhưng tôi tự hỏi ở mức độ nào của mô hình lưu phương thức tôi có thể chuyển đổi an toàn các ngày sang định dạng DATETIME không?

Một cách tiếp cận là phải làm như sau:

this.model.save({ 
    date : date.toDateTime() 
}, options); 

Tuy nhiên, điều này gây ra một sự kiện thay đổi được bắn từ các thuộc tính băm trước khi phương pháp tiết kiệm không phải là giống như băm sau sự kiện tiết kiệm (và điều này kích hoạt phương thức thiết lập của Backbone).

Trả lời

9

Tôi sẽ tư vấn sử dụng UNIX time (số giây/mili giây từ năm 1970) cả trong mô hình và trong giao diện và chỉ chuyển đổi thành ngày có thể đọc chỉ trong View.

Vì vậy, cả hai máy chủ gửi và nhận ngày dưới dạng số như 1328281766454 và đây là cách bạn lưu trữ chúng trong Backbone.Model. Khi nó phải được trả lại trong View bạn có thể chỉ cần gọi:

new Date(this.model.get('someTime')); //Fri Feb 03 2012 16:09:26 GMT+0100 (CET) 

Điều tương tự cũng có thể được thực hiện ở phía máy chủ. Hãy tin tôi, đây là cách đơn giản nhất và di động nhất của ngày chuyển đổi mà không có tất cả các vấn đề múi giờ này.

+4

thời gian Hoặc unix, hoặc một [ISO đại diện ngày chuẩn] (http://en.wikipedia.org/wiki/ISO_8601). Tôi thường sử dụng sau này. Nhưng tôi đồng ý rằng một đại diện tiêu chuẩn, phi đối tượng sẽ giúp tình hình. –

+0

Đó là một tùy chọn tôi đã xem xét, nhưng nó tạo ra khá nhiều chi phí bằng cách tạo ra một đối tượng ngày mỗi lần bạn cần. Một đại diện ngày nhất quán thực sự sẽ làm cho mọi thứ dễ dàng hơn nhiều. –

+3

Bạn đã thuyết phục tôi, Tomasz (và Rob). Nó sẽ mất một chút công việc, nhưng tôi thấy lợi ích của việc có định dạng ngày độc lập với môi trường/ngôn ngữ. Cảm ơn rất nhiều về thời gian của bạn Tomasz và Rob. Nhiều đánh giá cao. –

9

tôi muốn làm điều đó một trong hai nơi:

  • Trên máy chủ:

    này có lẽ làm cho ý nghĩa nhất, kể từ khi thực hiện server-side của bạn thực sự là một trong những nhu cầu DATETIME đại diện; mã máy khách của bạn không cần phải quan tâm.

  • Trong toJSON() trên mô hình của bạn:

    Nếu bạn phải làm điều đó trên máy khách, ghi đè Backbone.Model 's toJSON() cho mô hình của bạn và cập nhật nó ở đó. Ví dụ:

    toJSON: function() { 
        var json = Backbone.Model.prototype.toJSON.call(this); 
        json.date = convertDate(this.get('date')); 
        return json; 
    } 
    

    Nếu bạn làm điều này, bạn sẽ cần phải chuyển đổi ngày trở lại, hoặc trong của mô hình của bạn initialize() hoặc parse() chức năng.

+0

Tôi hoàn toàn đồng ý rằng nơi tốt nhất là làm điều đó ở phía máy chủ, nhưng tôi không nghĩ rằng nó có thể chuyển đổi một đối tượng ngày JavaScript thành một DATETIME với PHP. –

+0

@BartJacobs - Tôi chắc chắn nó là, nó chỉ là vấn đề bao nhiêu công việc bạn phải làm để thực hiện nó. Bạn chỉ cần xây dựng PHP 'date()' hoặc SQL 'DATETIME' từ các thuộc tính của đối tượng JSON. –

+0

Để đơn giản hóa và làm rõ một chút. Trong phân tích cú pháp: 'data.date = uiDate (data.date);' và trong toJSON: 'json.date = isoDate (json.date);' – juanitogan

7

không thể là câu trả lời bạn đang tìm kiếm - nhưng đã thấy folks sử dụng moment.js để định dạng thời gian trong xương sống -

http://momentjs.com/

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