2016-05-14 18 views
5

Yani, bir DateTime nesnesi ve sabit bir zaman verildiğinde, belirtilen DateTime nesnesinden sonra sabit sürenin sonraki oluşumunu almak istiyorum. 14 Mart 2016, 04:00 pm tarihi ve 05:15 pm zamanı göz önüne alındığında, ben 14 Mart dönmek istiyorum ÖrneğinRuby DateTime: Sonraki 5:15 pm (veya benzeri)

  • , 2016 17:15. bir sonraki durum olduğundan beri

  • Ancak 14 Mart 2016, 06:00 pm tarihi ve 05:15 pm zamanı göz önüne alındığında, ben, Mart , 05:15 pm dönmek istiyorum.

Şimdiye kadar, ben bu kodu yazdık:

# Given fixed_time and date_time 

new_time = date_time 
if fixed_time.utc.strftime("%H%M%S%N") >= date_time.utc.strftime("%H%M%S%N") 
    new_time = DateTime.new(
    date_time.year, 
    date_time.month, 
    date_time.day, 
    fixed_time.hour, 
    fixed_time.min, 
    fixed_time.sec 
) 
else 
    next_day = date_time.beginning_of_day + 1.day 
    new_time = DateTime.new(
    next_day.year, 
    next_day.month, 
    next_day.day, 
    fixed_time.hour, 
    fixed_time.min, 
    fixed_time.sec 
) 
end 

# Return new_time 

Çalışır, ancak daha iyi bir yolu var mı?

cevap

6

Sadece bir kez yeni tarih saat inşa etmek ve gerekirse 1 gün eklersiniz:

# Given fixed_time and date_time 

base_date = date_time.to_date 
if fixed_time.to_time.utc.strftime("%T%N") <= date_time.to_time.utc.strftime("%T%N") 
    base_date = base_date.next_day 
end 

new_time = DateTime.new(
    base_date.year, 
    base_date.month, 
    base_date.day, 
    fixed_time.hour, 
    fixed_time.min, 
    fixed_time.sec 
) 

# Return new_time 

büyük:

# Given fixed_time and date_time 
new_date_time = DateTime.new(
    date_time.year, 
    date_time.month, 
    date_time.day, 
    fixed_time.hour, 
    fixed_time.min, 
    fixed_time.sec 
) 

# add 1 day if new date prior to the given date 
new_date_time += 1.day if new_date_time < date_time 
1

İşte biraz bıçak var fazlalık bazılarını kaldırmak için üstlenmeden de değişiklikler, base_date'in, new_time oluşturulmadan önce belirlendiğinden, orada kullanılabilir.

Ayrıca ertesi gün için DateTime ile next_day yöntemi kullanılır, ve bir kısa yol olarak "% T" biçiminde belirteci kullanılan "% H:% M:% S" Burada

küçük bir test programı söz konusu açıklanan test durumları kullanıyor

Scheduled: 2016-03-14 17:15:00 
Scheduled: 2016-03-15 17:15:00 

ve beklenen cevaplar alır:

require "date" 

def next_schedule(fixed_time, date_time) 
    # Given fixed_time and date_time 

    base_date = date_time.to_date 
    if fixed_time.to_time.utc.strftime("%T%N") <= date_time.to_time.utc.strftime("%T%N") 
    base_date = base_date.next_day 
    end 

    new_time = DateTime.new(
    base_date.year, 
    base_date.month, 
    base_date.day, 
    fixed_time.hour, 
    fixed_time.min, 
    fixed_time.sec 
) 

    # Return new_time 
end 

StartTime = DateTime.strptime("2016-02-14 17:15:00", "%F %T") 
Dates = [ 
    "2016-03-14 16:00:00", 
    "2016-03-14 18:00:00" 
] 

Dates.each do |current_date| 
    scheduled = next_schedule(StartTime, DateTime.strptime(current_date, "%F %T")) 
    puts "Scheduled: #{scheduled.strftime('%F %T')}" 
end 

bu çıktısı: o çalıştığını göstermek için.

+0

Teşekkürler! Bu yaklaşım aynı olmasına rağmen, işlevin daha iyi ve daha küçük görünmesini sağlar. Daha iyi bir yaklaşımla bir cevap alamıyorsam, kesinlikle kabul edilen cevap olarak sizinkini işaretleyeceğim. – shashwat

+0

@shashwat Daha iyi bir yaklaşım bulabiliyor muydunuz, yoksa gittiğiniz yer mi? –

İlgili konular