2009-06-01 24 views
5

Tôi đang xem xét chuyển đổi ứng dụng Rails 2.3 của chúng tôi để xử lý chính xác múi giờ (tại thời điểm này mọi thứ ở UTC không đúng, nhưng tiện lợi!).Lưu trữ đúng ngày với TimeZone trong MySQL DB cho ứng dụng Rails

tôi có các thiết lập trong environment.rb:

config.active_record.default_timezone = :utc 
config.time_zone = "UTC" 

Trong tương lai, vào từng yêu cầu trong ứng dụng của chúng ta, tôi có kế hoạch đưa ra các thiết lập sau đây để thiết lập Time Zone:

Time.zone = user.time_zone 

đâu user.time_zone là sở thích đã chọn của chúng (ví dụ: US Pacific Time).

Điều này làm việc tốt trong ứng dụng, nhưng câu hỏi của tôi liên quan đến những gì Rails sau đó lưu trữ trong MySQL DB. Nếu người dùng chọn ngày 1 tháng 6 năm 2009, điều này được lưu trữ trong trường DATETIME trong cơ sở dữ liệu trong UTC nhưng với chênh lệch múi giờ. Ví dụ: nếu người dùng đã chọn múi giờ GMT+6, ngày được chọn ngày 1 tháng 6 năm 2009 kết thúc trong cơ sở dữ liệu là 2009-06-01 06:00:00 UTC.

Tôi đã dự kiến ​​điều này sẽ được lưu trữ dưới dạng 2009-06-01 00:00:00 UTC trong cơ sở dữ liệu. Suy nghĩ của tôi đúng hay là Rails đang làm điều gì đó bất ngờ ở đây?

+0

Bạn chỉ cần hiển thị ngày trong múi giờ của người dùng hay điều quan trọng là phải lưu trữ ngày đó cụ thể trong múi giờ đó? –

+0

Chris Tôi muốn lưu trữ nó trong UTC và chỉ hiển thị ngày trong múi giờ của người dùng – Olly

Trả lời

4

Blog này bài nói về múi giờ mẹ đẻ xử lý trong Rails 2.1 +:

http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/

Các ý chính là Rails sẽ lưu trữ tất cả các bản ghi trong DB trong UTC và sau đó chuyển sang múi giờ người dùng để trưng bày . Điều này có ý nghĩa: lưu trữ tất cả dữ liệu ở dạng trung lập và sau đó chuyển đổi nó thành biểu mẫu mong muốn ở phút cuối cùng.

0

Bạn cần đặt múi giờ trong đối tượng dữ liệu trước khi bạn đặt ngày.

1

Dựa trên phản hồi của bạn đối với nhận xét của tôi, tôi muốn lưu trữ ngày dựa trên thời gian máy chủ cục bộ, sau đó sử dụng Date :: toLocaleString() của JavaScript để chuyển đổi thành múi giờ địa phương của họ. Tôi đã viết một bài báo về nó một vài năm trước đây, mà bạn có thể tìm thấy here.

JS của bài viết được viết bằng MooTools, nhưng tôi đã viết lại nó với jQuery, vì vậy tôi sẽ hiển thị mã đó.

Các phần quan trọng:

Khi hiển thị HTML, sử dụng mili giây từ Epoch.

<span class="dt"><!-- <%= blah.created_at_epoch_ms %> --><%= blah.created_at %></span> 

nào đòi hỏi một phương pháp trong mô hình của bạn được định nghĩa như thế này:

def created_at_epoch_ms 
    self.created_at.to_i * 1000 
end 

Các JS để chuyển đổi các ngày:

$(document).ready(function(){ 
     $('span.dt').each(function(){ 
       var date = new Date(); 

       date.setTime(this.firstChild.data); 

       $(this).parent().text(date.toLocaleString()); 
     }); 
}); 

này nên chuyển đổi chuỗi thời gian cục bộ của người dùng, và phép thuật xảy ra trong toLocaleString(). Trình duyệt duy nhất tôi đã nghe nói về điều đó không thực hiện nó là Safari 2.0, mà không nên trình bày nhiều vấn đề, như tôi nghĩ hầu hết người dùng đã chuyển sang.

Tôi sử dụng phương pháp này trên my site và nếu bạn xem mã nguồn của trang, bạn có thể xem nó hoạt động như thế nào.Mã thực tế được gửi đến trình duyệt trông giống như:

<!-- 1243484521000 -->2009-05-28 04:22:01 UTC 

Đó là chuyển đổi trong trình duyệt của tôi (Central Time) để

Wednesday, May 27, 2009 11:22:01 PM 

Nếu họ đã JS được kích hoạt, nó sẽ lấy giá trị của nút nhận xét, chuyển đổi nó và thay thế toàn bộ chuỗi (bao gồm cả thời gian UTC) với giờ địa phương. Nếu JS bị tắt, họ sẽ chỉ thấy thời gian khi máy chủ nhìn thấy nó.

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