2014-11-03 13 views
10

Używam wielu DateTime w moim kodzie. Chcę zmienić te DateTimes na moją konkretną datę i zachować czas .Jak zmienić tylko część daty z DateTime, zachowując porę czasu?

1. "2012/02/02 06:00:00" => "2015/12/12 : 06:00:00" 
2. "2013/02/02 12:00:00" => "2015/12/12 : 12:00:00" 

używam tego stylu na zmiany, ale nie wydaje się dobrym sposobem i chcę zadać żadnego ze sposobów osiągnięcia tego zadania.

DateTime newDateTime = new DateTime(2015,12,12,oldDateTime.Hour,oldDateTime.Minute,0); 
+0

Jaką formułę używasz do obliczania nowego roku, miesiąca i dnia, czy po prostu chcesz zmienić wszystkie daty, aby ta sama data była częścią z pierwotną częścią czasu? –

+0

Co masz na myśli mówiąc "nie jest to dobra droga"? Co jest nie tak z obecną implementacją? –

+1

Podczas gdy twój kod pokazuje, jak tworzysz nowy obiekt datetime, nie pokazuje on kontekstu twojego pytania. na przykład, czy próbujesz wydrukować je w tym określonym formacie na konsolę lub ekran? Skąd masz pierwszą część wartości? Jestem pewien, że przy odrobinie więcej informacji wiele osób byłoby w stanie poprowadzić cię prawidłowo. –

Odpowiedz

11

Po udzieleniu informacji, myślę, że ta metoda jest w porządku. Jeśli chcesz uniknąć wielokrotnego przepisywania elementu oldDateTime.Hour,oldDateTime.Minute,0, możesz utworzyć własną klasę statyczną, aby uprościć wywołania metod.

W regularnego stosowania:

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime time = DateTime.Now; 
     DateTime newDateTime = MyDateTimeUtil.CreateDateFromTime(2015, 12, 12, time); 
    } 
} 

Statyczna klasa, która tworzy wartość DateTime:

public static class MyDateTimeUtil 
{ 
    public static DateTime CreateDateFromTime(int year, int month, int day, DateTime time) 
    { 
     return new DateTime(year, month, day, time.Hour, time.Minute, 0); 
    } 
} 
+0

Dziękuję, że grosze! To jest dobry pomysł z twoją klasą pomocników. Więc z tym przykładem oznacza to, że w języku C# nie ma żadnej metody, aby to zrobić dobrze? – borrom

+0

@borrom: Tak, jest to dość specjalistyczna prośba, więc nie oczekiwałbym, że klasa 'System.DateTime' będzie domyślnie uwzględniać tego rodzaju metodę. Wszystkie możliwe konstruktory 'DateTime' są wymienione w [wpisie MSDN] (http://msdn.microsoft.com/en-us/library/system.datetime (v = vs.110) .aspx). – grovesNL

12

lepszy sposób, który pozwala zachować sekundy, milisekundy i mniejszych części czasu będzie:

DateTime newDateTime = new DateTime(2015,12,12) + oldDateTime.TimeOfDay; 

Lub możesz zrobić metodę przedłużenia zastosować nową datę do istniejącego DateTime, a jednocześnie nie ufa nową datę być bez TimeOfDay na nim: -

public static DateTime WithDate (this DateTime datetime, DateTime newDate) 
{ 
    return newDate.Date + datetime.TimeOfDay; 
} 

IMHO DateTime jest jednym z najsłabszych elementów .NET. Na przykład kod TimeSpan nie jest taki sam jak TimeOfDay ani nie może reprezentować okresu "TimePeriod" (w miesiącach) - są to trzy oddzielne koncepcje i ich zmieszanie było złym wyborem. Przenoszenie do DateTimeOffset jest zazwyczaj preferowane lub do doskonałej biblioteki czasu Noda.

+0

@Lan Mercer. To działa, znajdź! Po tym, jak wypróbuję twój kod. Dziękuję – borrom

+0

Zrobiłem kilka szybkich benchmarków i odkryłem, że ta metoda zajmuje 1/6 czasu, który zajmuje użycie 'DateTime (int rok, int miesiąc, int dzień, int godzina, int minuta, int sekunda, int millisecond)' konstruktor . Jest także o 6% szybszy niż użycie opcji 'newDate.Date.AddTicks (datetime.TimeOfDay.Ticks)'. Zasadniczo skorzystaj z tego. :) – Andrew

Powiązane problemy