2010-10-27 25 views
13

Tôi hơi bối rối về múi giờ trong đường ray. Tôi muốn ứng dụng đường ray của tôi sử dụng Thời gian mùa hè của Anh (như tiết kiệm ánh sáng ban ngày ở Mỹ) cho các dấu thời gian được đặt trong updated_at và created_at trong các mô hình của tôi. Tôi đã thay đổi environment.rb của tôi để nóiDấu thời gian đường ray không sử dụng múi giờ đúng

config.time_zone = 'London' 

Các máy chủ ubuntu ứng dụng của tôi là trên dường như sử dụng BST cho đó là thời gian: trong dòng lệnh, ví dụ, nếu tôi gõ 'date' tôi nhận được thời gian hiện tại (không bù đắp một giờ). Trong bảng điều khiển đường ray, tôi thấy như sau:

>> time = Time.now 
=> Wed Oct 27 16:29:17 +0100 2010 
>> time.zone 
=> "BST" 

Tất cả đều ổn. Tuy nhiên, nếu tôi tạo một đối tượng mô hình AR mới và lưu nó, dấu thời gian là từ một giờ trước. Vì vậy, có vẻ như điều này đang sử dụng UTC. Bây giờ, tôi có thể thấy logic trong điều này: vì các dấu thời gian có thể được sử dụng trong logic mô hình, bạn muốn chúng được dựa trên một khoảng thời gian không thay đổi, nghĩa là UTC. Nhưng, đây là một chút hành vi kỳ lạ mà tôi không hiểu:

#change a record and save it 
>> someobj.save 
=> true 
#object's updated_at is one hour ago 
>> someobj.updated_at 
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00 
>> Time.now 
=> Wed Oct 27 16:34:31 +0100 2010 
#however, Time.now - object's updated at is just a few seconds. 
>> Time.now - someobj.updated_at 
=> 15.305549 

Vì vậy, trước khi trừ, cập nhật sẽ được chuyển đổi thành múi giờ hiện tại.

Lý do tôi muốn hiển thị ngày trong múi giờ hiện tại chỉ dành cho báo cáo trạng thái v.v. trong chế độ xem: nếu ai đó cập nhật nội dung tôi muốn họ thấy rằng nó đã được cập nhật '1 phút trước' không 'một giờ trước '.

Có ai không thể hiểu lầm tôi không? chúc mừng, tối đa

EDIT: Vấn đề trước mắt của tôi, hiển thị đúng thời điểm trong trạng thái, được giải quyết bằng cách sử dụng trình trợ giúp 'time_ago_in_words', điều chỉnh cho múi giờ. Tôi vẫn muốn một người nào đó giải thích những gì đang xảy ra với dấu thời gian mặc dù :)

Trả lời

38

Dấu thời gian được lưu trữ trong UTC theo mặc định và đây có lẽ là cách tốt nhất để làm điều đó. Nếu bạn di chuyển từ môi trường máy chủ này sang môi trường máy chủ khác, bạn không muốn tất cả thời gian của mình thay đổi chỉ vì bạn đã chuyển múi giờ.

Nếu bạn muốn biết những gì thời gian có được theo múi giờ địa phương của bạn, bạn chỉ cần phải hỏi cho nó như vậy:

someobj.updated_at.localtime 
+0

ah - đó là tuyệt vời. cảm ơn! Tôi đồng ý rằng việc giữ tất cả chúng trong UTC có ý nghĩa. –

+0

ok, tôi hiểu rồi. nhưng nếu tôi muốn hiển thị giờ địa phương vào ngày giờ chọn thì tôi có thể làm gì? – Diego

+0

Có lẽ cách tốt nhất là sử dụng một phương thức JavaScript để ánh xạ thời gian hệ thống đến thời gian địa phương của trình duyệt. Đó là một câu hỏi khác. – tadman

2

Lưu ý chênh lệch được liệt kê ở cuối thời gian - giá trị bù đầu tiên là 0, giá trị thứ hai là 1. Khi tính toán thời gian xảy ra, bù đắp được bao gồm tự động, do đó phép trừ cho bạn kết quả chính xác. someobj.updated_atTime.now mỗi giá trị hiển thị giá trị của nó theo múi giờ khác nhau, vì vậy chúng chỉ cách nhau 9 giây, không phải 1 giờ và 9 giây.

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