2014-11-03 14 views
10

Ich verwende viele DateTime in meinem Code. Ich möchte diese DateTimes zu meinem bestimmten Datum ändern und Zeit behalten.Wie wird nur der Datumsteil einer DateTime geändert, während der Zeitabschnitt beibehalten wird?

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" 

Ich benutze diese Art zu ändern, aber es scheint nicht den guten Weg und ich möchte fragen, jede mögliche Weise haben diese Aufgabe zu erreichen.

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

Mit welcher Formel berechnen Sie das neue Jahr, den Monat und den Tag oder versuchen Sie nur, alle Datumsangaben so zu ändern, dass das gleiche Datum mit der ursprünglichen Zeitangabe übereinstimmt? –

+0

Und was meinst du mit "nicht der gute Weg"? Was ist falsch an der aktuellen Implementierung? –

+1

Während Ihr Code zeigt, wie Sie ein neues Datetime-Objekt erstellen, wird der Kontext Ihrer Frage nicht angezeigt. Versuchen Sie beispielsweise, sie in diesem spezifischen Format auf der Konsole oder dem Bildschirm auszugeben? Woher bekommst du den ersten Teil des Wertes? Ich bin sicher, dass mit ein wenig mehr Informationen eine Menge Leute in der Lage wären, Sie richtig zu führen –

Antwort

11

Mit den Informationen, die Sie gegeben haben, denke ich, dass diese Methode in Ordnung ist. Wenn Sie vermeiden möchten, das oldDateTime.Hour,oldDateTime.Minute,0 Stück oft neu zu schreiben, könnten Sie Ihre eigene statische Klasse erstellen, um die Methodenaufrufe zu vereinfachen.

In Ihrer normalen Anwendung:

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

Die statische Klasse, die den DateTime Wert schafft:

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

Vielen Dank grovesNL! Es ist eine gute Idee mit Ihrer Helferklasse. Also mit diesem Beispiel bedeutet es, dass in C# keine Methode hat, das richtig zu machen? – borrom

+0

@borrom: Ja, das ist eine ziemlich spezialisierte Anfrage, daher würde ich nicht erwarten, dass die 'System.DateTime'-Klasse diese Art von Methode standardmäßig enthält. Alle möglichen 'DateTime'-Konstruktoren sind in [dem MSDN-Eintrag] (http://msdn.microsoft.com/en-us/library/system.datetime (v = vs.110) .aspx) aufgelistet. – grovesNL

12

Eine bessere Art und Weise, die die Sekunden, Millisekunden und kleinere Teile der Zeit wäre bewahrt:

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

Oder Sie könnten eine Erweiterungsmethode machen ein neues Datum zu einem bestehenden Datetime und zugleich anzuwenden, nicht das neue Datum vertrauen ohne TimeOfDay darauf sein: -

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

IMHO DateTime einer der schwächsten Teile von .NET ist. Zum Beispiel ist eine TimeSpan nicht das gleiche wie eine TimeOfDay noch kann es eine "TimePeriod" (in Monaten) darstellen - das sind drei separate Konzepte und ihre Vermischung war eine schlechte Wahl. Der Wechsel zu DateTimeOffset wird generell bevorzugt oder zur ausgezeichneten Noda-Zeitbibliothek.

+0

@Lan Mercer. Es funktioniert finden! Nachdem ich deinen Code getestet habe. Danke – borrom

+0

Ich habe ein paar schnelle Benchmarks gemacht und festgestellt, dass diese Methode 1/6 der Zeit in Anspruch nimmt, die der 'DateTime (int Jahr, int Monat, int Tag, int Stunde, int Minute, int Sekunde, int Millisekunde) Konstruktor benötigt . Außerdem ist es etwa 6% schneller als die Verwendung von 'newDate.Date.AddTicks (datetime.TimeOfDay.Ticks)'. Also benutze das im Grunde. :) – Andrew

Verwandte Themen