2012-06-19 11 views
11

W języku C# istnieje klasa TimeSpan. Reprezentuje okres czasu i jest zwracany z wielu opcji manipulowania datami. Możesz je utworzyć i dodać lub odjąć od daty itd.Czy Ruby ma odpowiednik TimeSpan w języku C#?

W rubinach i specjalnie na szynach wydaje się, że jest dużo klas daty i czasu, ale nic, co reprezentuje okres czasu?

Idealnie chciałbym obiektu, który mógłbym użyć do wypisywania sformatowanych dat z wystarczającą łatwością przy użyciu standardowych opcji formatowania daty.

np.

ts.to_format("%H%M") 

Czy istnieje taka klasa?

Jeszcze lepiej byłoby, gdybym mógł zrobić coś takiego

ts = end_date - start_date 

Jestem świadomy, że odjęcie od wyników dwóch dat w liczbie sekund oddzielających powiedział dat i że mogłem pracować to wszystko od tego.

Odpowiedz

1

W końcu rozwidlony sugestię w odpowiedzi @ tokland użytkownika. Nie pewny jak to zrobić właściwego gem ale to obecnie pracuje dla mnie:

Timespan fork of time_diff

+0

Anonimowe downwizery są kulawe. – toxaq

6

można zrobić coś podobnego tak:

irb(main):001:0> require 'time'   => true 
irb(main):002:0> initial = Time.now  => Tue Jun 19 08:19:56 -0400 2012 
irb(main):003:0> later = Time.now  => Tue Jun 19 08:20:05 -0400 2012 
irb(main):004:0> span = later - initial => 8.393871 
irb(main):005:0> 

To właśnie zwraca czas w sekundach, który nie jest wszystko, dość spojrzeć, można użyć funkcji strftime() aby wyglądać całkiem:

irb(main):010:0> Time.at(span).gmtime.strftime("%H:%M:%S") => "00:00:08" 
+0

Dzieje się dokładnie to, co robię w tej chwili. Ogranicza to nieumiejętność pokazania ponad 24 godzin różnicy czasu. – toxaq

+0

@toxaq Czas jest w rzeczywistości abstrakcją dat i czasów, co może być mylące, biorąc pod uwagę nazwę. Możesz tworzyć obiekty czasu dla danego roku/miesiąca/dnia/godziny/minuty/sekundy i wykonywać na nich dodawanie i odejmowanie. http://www.ruby-doc.org/core-1.9.3/Time.html –

+0

To jest interesująca rzecz w danym okresie, ale nie ma pojęcia o jej miejscu w odniesieniu do czegoś innego. To tylko gloryfikowana int z pewnymi fajnymi metodami dostępowymi. – toxaq

1

Nie, nie ma. Możesz po prostu dodać sekundy lub użyć metody advance.

end_date - start_date będzie miał Float typ

3

coś takiego? https://github.com/abhidsm/time_diff

require 'time_diff' 
time_diff_components = Time.diff(start_date_time, end_date_time) 
+0

To wygląda naprawdę interesująco. Nie do końca to, czego chciałem, ale zdecydowanie mogę z nim pracować lub wyprowadzić. – toxaq

0

jeszcze nie @toxaq ... ale zacząłem coś!

https://gist.github.com/thatandyrose/6180560

class TimeSpan 
attr_accessor :milliseconds 

def self.from_milliseconds(milliseconds) 
    me = TimeSpan.new 
    me.milliseconds = milliseconds 
    return me 
end 

def self.from_seconds(seconds) 
    TimeSpan.from_milliseconds(seconds.to_d * 1000) 
end 

def self.from_minutes(minutes) 
    TimeSpan.from_milliseconds(minutes.to_d * 60000) 
end 

def self.from_hours(hours) 
    TimeSpan.from_milliseconds(hours.to_d * 3600000) 
end 

def self.from_days(days) 
    TimeSpan.from_milliseconds(days.to_d * 86400000) 
end 

def self.from_years(years) 
    TimeSpan.from_days(years.to_d * 365.242) 
end 

def self.diff(start_date_time, end_date_time) 
    TimeSpan.from_seconds(end_date_time - start_date_time) 
end 

def seconds 
    self.milliseconds.to_d * 0.001 
end 

def minutes 
    self.seconds.to_d * 0.0166667 
end 

def hours 
    self.minutes.to_d * 0.0166667 
end 

def days 
    self.hours.to_d * 0.0416667 
end 

def years 
    self.days.to_d * 0.00273791 
end 
end 
+0

Chłodny, bardzo podobny do tego, co dzieje się w toklandie klejnotów sugerowany, który rozwidlałem, aby uzyskać to, co chciałem się dzieje. – toxaq

Powiązane problemy