2011-12-18 28 views
20

Tôi hơi bối rối giữa Ngày, Thời gian và Thời gian trong Ruby. Hơn nữa, ứng dụng của tôi nhạy cảm với múi giờ, và tôi không chắc chắn làm thế nào để chuyển đổi giữa ba thời gian này trong khi vẫn là múi giờ mạnh mẽ.Kiểm tra xem hai dấu thời gian có cùng ngày trong Ruby

Làm cách nào để kiểm tra xem hai dấu thời gian unix (giây kể từ thời đại) có biểu thị cùng ngày không? (Tôi không thực sự quan tâm nếu nó sử dụng thời gian địa phương hoặc UTC, trong khi tôi muốn thời gian địa phương, miễn là nó phù hợp, tôi có thể thiết kế xung quanh đó).

Trả lời

37

Sử dụng tiêu chuẩn thư viện, chuyển đổi đối tượng Thời gian thành Ngày.

require 'date' 

Time.at(x).to_date === Time.at(y).to_date 

Ngày có phương thức === sẽ đúng nếu hai đối tượng ngày đại diện cho cùng một ngày.

+0

Đây có phải là UTC không? – chimeracoder

+0

Ngày và giờ trong Ruby là nhận biết múi giờ. Vì vậy, nếu bạn tạo đối tượng Date sử dụng UTC, thì có nó sẽ ở dạng UTC. Nếu bạn tạo chúng bằng một vùng khác, thì chúng sẽ nằm trong vùng đó. – Anurag

+2

eh, tại sao điều này lại bị giảm giá? – Anurag

5

ActiveSupport định nghĩa đẹp to_date method cho lớp Time. Đó là cách nó trông giống như:

class Time 
    def to_date 
    ::Date.new(year, month, day) 
    end 
end 

Sử dụng nó, bạn có thể so sánh timestamps như thế:

Time.at(ts1).to_date === Time.at(ts2).to_date 

Và đây là cách ít gây tranh cãi mà không cần mở rộng Time lớp:

t1 = Time.at(ts1) # local time corresponding to given unix timestamp ts1 
t2 = Time.at(ts2) 
Date.new(t1.year, t1.month, t1.day) === Date.new(t2.year, t2.month, t2.day) 
+0

Câu hỏi này được gắn thẻ với 'Ruby'; Tôi không nghĩ công bằng khi cho rằng anh ấy sử dụng Rails. –

+0

Vâng, tôi không sử dụng Rails. Ngoài ra, Time.at (1324196871) .to_date == Time.at (1324253810) .to_date trả về false cho tôi ... là nó tự động chuyển đổi dấu thời gian để localtime cho tôi? – chimeracoder

+0

Nhưng anh ta có thể tự định nghĩa phương thức trợ giúp này. Mã được cung cấp. :-) –

2
Time.at(ts1).day == Time.at(ts2).day && (ts1 - ts2).abs <= 86400 

Hoặc

t1 = Time.at(ts1) 
t2 = Time.at(ts2) 
t1.yday == t2.yday && t1.year == t2.year 

Trong trường hợp đầu tiên, chúng tôi chắc chắn rằng timestamps là không quá ngày ngoài (vì #day trả về ngày tháng và không có kiểm tra bổ sung này 01 tháng tư sẽ được tính bằng tháng 1)

Một giải pháp thay thế là phải mất cả ngày trong năm và đảm bảo rằng chúng là cùng năm.

Những phương pháp làm việc tốt như nhau ở cả 1,8 và 1,9 :-)

1

Chúng ta có thể sử dụng beginning_of_day thời gian và so sánh chúng: t1.beginning_of_day == t2.beginning_of_day Bằng cách này, các múi giờ sẽ không bị ảnh hưởng.

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