2012-03-07 29 views
20

Làm cách nào để xác định số ngày giữa hai phiên bản Thời gian trong Ruby?Số ngày giữa hai Trường hợp thời gian

> earlyTime = Time.at(123) 
> laterTime = Time.now 
> time_difference = laterTime - earlyTime 

Tôi muốn xác định số ngày trong time_difference (Tôi không lo lắng về các phần phân đoạn của ngày. Làm tròn lên hoặc xuống là tốt).

+2

Bạn có quan tâm đến thời gian tiết kiệm ánh sáng ban ngày không? – Phrogz

+1

câu hỏi hay. kế toán cho thời gian tiết kiệm ánh sáng ban ngày và năm nhuận là không quan trọng vì tính toán này chỉ nhắc nhở một email nhắc nhở một vài người. – SundayMonday

Trả lời

34

Sự khác biệt của hai lần tính bằng giây. Chia nó theo số giây trong 24 giờ.

(t1 - t2).to_i/(24 * 60 * 60) 
+3

Điều này không hoạt động trên các thay đổi về thời gian tiết kiệm ánh sáng ban ngày. – ChrisInEdmonton

+0

Cách tốt nhất để làm điều đó sau đó là tài khoản cho DST là gì? – Tallboy

+0

@Tallboy những gì tôi làm là lưu trữ mọi thứ trong 'UTC' và thực hiện các phép tính này với các trường' Time' của 'zone'' UTC'. Thời gian tiết kiệm ánh sáng ban ngày sẽ hiển thị thích hợp khi hiển thị bất kỳ 'Thời gian' nào trong một chế độ xem. –

5
earlyTime = Time.at(123) 
laterTime = Time.now 
time_difference = laterTime - earlyTime 
time_difference_in_days = time_difference/1.day # just divide by 1.day 
+0

Tôi xin lỗi, bạn đã đề cập đến Ruby nhưng không cụ thể là Ruby on Rails. Tôi không nghĩ rằng bạn sẽ nhận được chức năng 1.day trong vanilla ruby. –

+1

đó là chính xác, bạn không. Trừ khi bạn yêu cầu một phần thích hợp của active_support. –

+0

Điều này không hoạt động trên các thay đổi về thời gian tiết kiệm ánh sáng ban ngày. – ChrisInEdmonton

15
require 'date' 
days_between = (Date.parse(laterTime.to_s) - Date.parse(earlyTime.to_s)).round 

Sửa ... hoặc đơn giản hơn ...

require 'date' 
(laterTime.to_date - earlyTime.to_date).round 
+0

Xâu chuỗi thời gian để phân tích chúng ngay lập tức có vẻ hơi lạ với tôi :) –

+0

@Sergio Bạn nói đúng, điều đó thật ngu ngốc.Đã chỉnh sửa :) – Phrogz

4

Để giải thích cho DST (Daylight Saving Time), bạn phải đếm nó bằng cách những ngày. Lưu ý rằng điều này giả định ít hơn một ngày được tính là 1 (làm tròn lên):

num = 0 
cur = start_time 
while cur < end_time 
    num += 1 
    cur = cur.advance(:days => 1) 
end 
return num 
+0

quá chậm để sử dụng chung –

3
[1] pry(main)> earlyTime = Time.at(123) 
=> 1970-01-01 01:02:03 +0100 
[2] pry(main)> laterTime = Time.now 
=> 2014-04-15 11:13:40 +0200 
[3] pry(main)> (laterTime.to_date - earlyTime.to_date).to_i 
=> 16175 
0

Không ai trong số những câu trả lời thực sự sẽ làm việc nếu bạn không muốn để ước tính và bạn muốn đưa vào ánh sáng ban ngày tài khoản tiết kiệm thời gian. Ví dụ: Ví dụ: 10 giờ sáng Thứ Tư trước khi thay đổi đồng hồ giảm và 10 giờ sáng Thứ Tư sau đó, thời gian giữa chúng sẽ là 1 tuần và 1 giờ. Vào mùa xuân nó sẽ là 1 tuần trừ đi 1 giờ. Để có được thời gian chính xác bạn có thể sử dụng đoạn mã sau

def self.days_between_two_dates later_time, early_time 
    days_between = (later_time.to_date-early_time.to_date).to_f 
    later_time_time_of_day_in_seconds = later_time.hour*3600+later_time.min*60+later_time.sec 
    earlier_time_time_of_day_in_seconds = early_time.hour*3600+early_time.min*60+early_time.sec 
    days_between + (later_time_time_of_day_in_seconds - early_time_time_of_day_in_seconds)/1.0.day 
end 
2

Đây là một câu trả lời đơn giản rằng công trình trên DST:

numDays = ((laterTime - earlyTime)/(24.0*60*60)).round

60 * 60 là số giây trong một giờ 24.0 là số giờ trong một ngày. Đó là một phao bởi vì một số ngày là một ít hơn 24 giờ, một số ít hơn. Vì vậy, khi chúng tôi chia cho số giây trong một ngày, chúng tôi vẫn có một phao và vòng sẽ tròn thành số nguyên gần nhất.

Vì vậy, nếu chúng tôi đi qua DST, dù bằng cách nào, chúng tôi vẫn sẽ làm tròn đến ngày gần nhất. Ngay cả khi bạn đang ở trong một khoảng thời gian kỳ lạ thay đổi hơn một giờ cho DST.

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