2012-04-23 12 views
45

Chcę przekonwertować przedział czasowy na Datetime. Jak mogę to zrobić?Konwersja z TimeSpan na DateTime

Znalazłem jeden sposób na Google:

DateTime dt; 
TimeSpan ts="XXX"; 

//We can covnert 'ts' to 'dt' like this: 

dt= Convert.ToDateTime(ts.ToString()); 

jest jakiś inny sposób to zrobić?

+4

Jeśli masz punktu początkowego (który trzeba będzie), wystarczy dodać przedziale czasu do daty rozpoczęcia. – leppie

+0

Nie mam czasu rozpoczęcia. Wyeksponowany API obsługuje tylko DateTime – Raghav55

+2

Jeśli nie masz punktu początkowego ani końcowego, to, co próbujesz zrobić, jest bezsensowne. – leppie

Odpowiedz

74

Przekształcenie TimeSpan na DateTime nie jest zbyt logiczne. Spróbuj zrozumieć, co powiedzieli leppie powyżej. TimeSpan to czas mówiący 6 dni 5 godzin 40 minut. To nie jest Data. Jeśli powiem 6 dni; Czy możesz wydedukować z niej datę? Odpowiedź brzmi NIE, chyba że masz DOWÓD REFERENCYJNY.

Więc jeśli chcesz przekonwertować TimeSpan na DateTime, potrzebujesz daty referencyjnej. 6 dni & 5 godzin od kiedy? Możesz napisać coś takiego:

DateTime dt = new DateTime(2012, 01, 01); 
TimeSpan ts = new TimeSpan(1, 0, 0, 0, 0); 
dt = dt + ts; 
+1

Twoja odpowiedź jest poprawna i dziękuję ci ... ale konwersja TimeSpan na DateTime może być logiczną, znaczącą rzeczą do zrobienia. Na przykład Entity Framework odwzorowuje typ czasu TSQL (który jest porą dnia) na TimeSpan - jako czas trwania od północy. Aby sformatować wartość, chcę ją jako DateTime, więc mogę użyć jednej z jej metod formatowania, która wyklucza część daty ... Może EF powinien zamiast tego używać DateTime, ale myślę, że to co najmniej w pewnym sensie traktować TimeSpan jako czas trwania od północy i poza tym nie mogę zmienić zachowania EF. – steve

+1

Używam DateTime.Today + ts do konwersji, a jeśli chcesz sformatować czas wyświetlenia, będzie dobrze wyglądać – zquanghoangz

+0

Po prostu wypróbowałem ts + dt i otrzymałem "operator + nie można zastosować", więc bądź ostrożny. Suma nie jest przemienna. – Michal

7

Potrzebna jest data referencyjna, aby było to przydatne.

Przykład z http://msdn.microsoft.com/en-us/library/system.datetime.add.aspx

// Calculate what day of the week is 36 days from this instant. 
System.DateTime today = System.DateTime.Now; 
System.TimeSpan duration = new System.TimeSpan(36, 0, 0, 0); 
System.DateTime answer = today.Add(duration); 
System.Console.WriteLine("{0:dddd}", answer); 
+0

Bardzo przydatna funkcja zwracania wartości czasu z bazy danych, która musi być wyświetlana w siatce! – gchq

25

Gdy wybrana odpowiedź jest absolutnie poprawne, wierzę rozumiem co PO próbuje dostać się tutaj, jak miałem podobny problem.

Miałem TimeSpan, który chciałem wyświetlić w formancie siatki (jak tylko hh: mm), ale siatka nie wydaje się rozumieć TimeSpan, tylko DateTime. OP ma podobny scenariusz, w którym tylko TimeSpan jest odpowiednią częścią, ale nie uwzględnia konieczności dodania punktu odniesienia DateTime.

Tak, jak wskazano powyżej, po prostu dodałem DateTime.MinValue (jakkolwiek zrobi to dowolna data), która jest następnie ignorowana przez siatkę, gdy renderuje ona przedział czasowy jako część czasu wynikowej daty.

+0

To był dokładnie mój przypadek użycia, z wyjątkiem wykresu. Musiałem pokazać upływ czasu w osi X. –

-3

Problem z powyższymi problemami polega na tym, że konwersja zwraca niepoprawną liczbę dni określoną w parametrze TimeSpan.
Korzystając z powyższego, poniżej zwraca 3, a nie 2.

Pomysły na zachowanie 2 dni w argumentach TimeSpan i zwrócenie ich jako dni DateTime?

public void should_return_totaldays() 
{ 
    _ts = new TimeSpan(2, 1, 30, 10); 
    var format = "dd"; 
    var returnedVal = _ts.ToString(format); 
    Assert.That(returnedVal, Is.EqualTo("2")); //returns 3 not 2 
} 
+2

Spodziewanym rezultatem podczas używania formatu "dd" będzie "02". – Joe

+1

Rzeczywisty wynik podczas działania twojego kodu wynosi "02". Jedyne zdalne wyjaśnienie, jakie mogę sobie wyobrazić, to _ts nie jest zdefiniowany jako TimeSpan (nie deklarujesz go w swoim snippacie), ale twój komentarz w kodzie jest niepoprawny. Gdy _ts jest zadeklarowane jako TimeSpan, zwraca poprawną wartość składnika dni trwania. – Mike

-4

pierwsze, przekształcić przedziale czasu na sznurku, a następnie do DateTime, a następnie z powrotem do łańcucha:

Convert.ToDateTime(timespan.SelectedTime.ToString()).ToShortTimeString(); 
+4

Czy to nie to samo, co sugerował OP? Poprosił najpierw o metody inne niż konwersja na ciąg. – Joe

+0

SelectedTime nie istnieje – MiBol

3

TimeSpan mogą być dodawane do świeżej DateTime do osiągnięcia tego celu.

TimeSpan ts="XXX"; 
DateTime dt = new DateTime() + ts; 

Ale jak wspomniano wcześniej, nie jest to ściśle logiczne bez prawidłowej daty rozpoczęcia. Znalazłem przypadek użycia, w którym wymagałem tylko aspektu czasu. będzie działać poprawnie, o ile logika jest poprawna.

-3

Łatwym sposobem, użycie kleszczy:

new DateTime((DateTime.Now - DateTime.Now.AddHours(-1.55)).Ticks).ToString("HH:mm:ss:fff") 

Funkcja ta daje datę (bez dzień/miesiąc/rok)

+1

OP chciał przekształcić Timepan na DateTime, Twoja odpowiedź nie rozwiązuje tego problemu. – Mike

+0

WSKAZÓWKA: Jeśli potrzebujesz części czasowej 'DateTime', po prostu wykonaj' .TimeOfDay'. Podobny do fragmentu daty, ' .Date'. – auhmaan

0

Jeśli trzeba tylko pokazać wartość czasu w datagrid lub etykiecie podobnie, najlepiej jest konwertować bezpośrednio czas w typach datetime.

SELECT CONVERT (datetime, myTimeField) jako myTimeField FROM Table1

0
var StartTime = new DateTime(item.StartTime.Ticks);