Antworten:
Sie können einen DateTime-Wert nicht ändern - er ist unveränderlich. Sie können die Variable jedoch so ändern, dass sie einen neuen Wert hat. Der einfachste Weg, dies zu tun, um nur die Zeit zu ändern, besteht darin, eine Zeitspanne mit der relevanten Zeit zu erstellen und die DateTime.Date-Eigenschaft zu verwenden:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
wird jetzt das gleiche Datum sein, aber um 10.30 Uhr.
Beachten Sie, dass DateTime
Sommerzeitübergänge nicht berücksichtigt werden, die die "naive" Gregorianische Zeit in beide Richtungen darstellen (siehe Abschnitt "Anmerkungen" in den DateTime
Dokumenten ). Die einzigen Ausnahmen sind .Now
und .Today
: Sie rufen die aktuelle Systemzeit ab, die diese Ereignisse widerspiegelt, sobald sie auftreten.
Dies hat mich motiviert, das Noda Time- Projekt zu starten , das jetzt produktionsbereit ist. Sein ZonedDateTime
Typ wird "bekannt gemacht", indem er mit einem tz
Datenbankeintrag verknüpft wird .
Add
Bereitstellung einer Zeitspanne von Null anrufen? Ihr Ausdruck ist gleichbedeutend mit s.Date
, aber länger ...
DateTime
s haben (eine für das Datum und eine für die Uhrzeit), können Sie dies tun:var result = date.Date + time.TimeOfDay;
time
kein Modell sein sollte DateTime
. (Ich würde natürlich Noda Time verwenden, aber ...)
Okay, ich tauche mit meinem Vorschlag ein, einer Erweiterungsmethode:
public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds, int milliseconds)
{
return new DateTime(
dateTime.Year,
dateTime.Month,
dateTime.Day,
hours,
minutes,
seconds,
milliseconds,
dateTime.Kind);
}
Dann ruf an:
DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
Es ist wichtig zu beachten, dass diese Erweiterung ein neues Datumsobjekt zurückgibt. Sie können dies also nicht tun:
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
Aber Sie können dies tun:
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Datetime.Today.Add(time.TimeOfDay)
. Dies liegt daran, dass der Konstruktor intern keine kalenderbasierten Korrekturen vornimmt, außer dass ein Schaltjahr für den Datumsteil berücksichtigt wird. Dh DateTime
ist eine "naive" Implementierung in Bezug auf Pythons datetime
Modul.
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
Auf diese Weise behalten Sie Ihr Datum bei, während Sie einen neuen Stunden-, Minuten- und Sekunden-Teil nach Ihren Wünschen einfügen.
.AddMilliseconds()
bei Bedarf.
Einzeiler
var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));
würde das heutige Datum mit einer Zeit von 4:30:00 zurückbringen, DateTime.Now durch ein beliebiges Datumsobjekt ersetzen
DateTime ist ein unveränderlicher Typ, daher können Sie ihn nicht ändern .
Sie können jedoch eine neue DateTime-Instanz basierend auf Ihrer vorherigen Instanz erstellen. In Ihrem Fall scheint es so, als ob Sie die Date-Eigenschaft benötigen, und Sie können dann eine Zeitspanne hinzufügen, die die Tageszeit darstellt.
Etwas wie das:
var newDt = s.Date + TimeSpan.FromHours(2);
Wenn Sie die Zeit bereits in einem anderen DateTime
Objekt gespeichert haben , können Sie die Add
Methode verwenden.
DateTime dateToUse = DateTime.Now();
DateTime timeToUse = new DateTime(2012, 2, 4, 10, 15, 30); //10:15:30 AM
DateTime dateWithRightTime = dateToUse.Date.Add(timeToUse.TimeOfDay);
Die TimeOfDay
Eigenschaft ist ein TimeSpan
Objekt und kann an die Add
Methode übergeben werden. Und da wir die Date
Eigenschaft der dateToUse
Variablen verwenden, erhalten wir nur das Datum und fügen die Zeitspanne hinzu.
Einfachste Lösung:
DateTime s = //some Datetime that you want to change time for 8:36:44 ;
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44);
Und wenn Sie ein bestimmtes Datums- und Uhrzeitformat benötigen:
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");
Geschah bei diesem Beitrag, als ich nach der gleichen Funktionalität suchte, die möglicherweise das tun könnte, was der Typ wollte. Nehmen Sie das ursprüngliche Datum und ersetzen Sie den Zeitteil
DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
Da DateTime
unveränderlich ist, muss eine neue Instanz erstellt werden, wenn eine Datumskomponente geändert werden muss. Leider gibt es keine integrierte Funktionalität zum Festlegen einzelner Komponenten einer DateTime
Instanz.
Verwenden der folgenden Erweiterungsmethoden
public static DateTime SetPart(this DateTime dateTime, int? year, int? month, int? day, int? hour, int? minute, int? second)
{
return new DateTime(
year ?? dateTime.Year,
month ?? dateTime.Month,
day ?? dateTime.Day,
hour ?? dateTime.Hour,
minute ?? dateTime.Minute,
second ?? dateTime.Second
);
}
public static DateTime SetYear(this DateTime dateTime, int year)
{
return dateTime.SetPart(year, null, null, null, null, null);
}
public static DateTime SetMonth(this DateTime dateTime, int month)
{
return dateTime.SetPart(null, month, null, null, null, null);
}
public static DateTime SetDay(this DateTime dateTime, int day)
{
return dateTime.SetPart(null, null, day, null, null, null);
}
public static DateTime SetHour(this DateTime dateTime, int hour)
{
return dateTime.SetPart(null, null, null, hour, null, null);
}
public static DateTime SetMinute(this DateTime dateTime, int minute)
{
return dateTime.SetPart(null, null, null, null, minute, null);
}
public static DateTime SetSecond(this DateTime dateTime, int second)
{
return dateTime.SetPart(null, null, null, null, null, second);
}
Sie können einzelne DateTime
Komponenten wie einstellen
var now = DateTime.Now;
now.SetSecond(0);
Wenn Sie eine DateTime wie 2014/02/05 18:19:51 haben und nur 2014/02/05 möchten, können Sie dies tun:
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
Durch Hinzufügen von .Date zu Ihrem Datum wird Mitternacht (00:00) festgelegt.
MyDate.Date
Hinweis Das äquivavalente SQL istCONVERT(DATETIME, CONVERT(DATE, @MyDate))
Was diese Methode so gut macht, ist, dass sie sowohl schnell zu tippen als auch leicht zu lesen ist. Ein Bonus ist, dass es keine Konvertierung von Strings gibt.
Dh Um das heutige Datum auf 23:30 Uhr einzustellen, verwenden Sie:
DateTime.Now.Date.AddHours(23).AddMinutes(30)
Sie können DateTime.Now oder MyDate natürlich durch ein beliebiges Datum Ihrer Wahl ersetzen.
Tatsächlich können Sie die Uhrzeit nach ihrer Erstellung nicht mehr ändern. Sie können es jedoch problemlos mit vielen Konstruktoren erstellen: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2
Wenn Sie beispielsweise eine DateTime erstellen möchten, die Sekunden ändert, können Sie dies einfach tun:
DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
int year = 2012;
int month = 12;
int day = 24;
int hour = 0;
int min = 0;
int second = 23;
DateTime dt = new DateTime(year, month, day, hour, min, second);
Verwenden Sie Date.Add
und fügen Sie ein New TimeSpan
mit der neuen Zeit hinzu, die Sie hinzufügen möchten
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
DateTime
Verwenden Sie beim Erstellen Ihres Objekts einen Konstruktor, mit dem Sie die Zeit angeben können:
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
Wenn Sie bereits ein DateTime
Objekt haben und die Zeit ändern möchten, können Sie DateTime
mit einfachen Methoden Minuten, Stunden oder Sekunden hinzufügen :
var myDateTime = new DateTime(2000, 01, 01); // 2000-01-01 00:00:00
myDateTime = myDateTime.AddHours(13); // 2000-01-01 13:00:00
myDateTime = myDateTime.AddMinutes(37); // 2000-01-01 13:37:00
myDateTime = myDateTime.AddSecounds(42); // 2000-01-01 13:37:42
Beachten Sie, wie wir das Ergebnis jedes Methodenaufrufs an die myDateTime
Variable "speichern" müssen . Dies liegt daran, dass das DateTime
unveränderlich ist und seine Methoden einfach neue Instanzen mit den zusätzlichen Stunden / Minuten / Sekunden erstellen.
Wenn Sie sowohl Stunden als auch Minuten (und / oder Sekunden) und dieselbe Zeit hinzufügen müssen, können Sie den Code vereinfachen, indem Sie stattdessen TimeSpan
dem Original ein hinzufügen DateTime
:
var myDateTime = new DateTime(2000, 01, 01); // 2000-01-01 00:00:00
myDateTime += new TimeSpan(13, 37, 42); // 2000-01-01 13:37:42
Wenn Sie absolute Stunden / Minuten / Sekunden festlegen möchten, anstatt die vorhandenen Werte zu ergänzen, können Sie den oben genannten DateTime
Konstruktor verwenden und Werte für Jahr / Monat / Tag von früher wiederverwenden:
myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
20, 33, 19) // 2000-01-01 20:33:19
Hier ist eine Methode, mit der Sie es für Sie tun können. Verwenden Sie es so
DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);
Hier ist die Methode, es gibt wahrscheinlich einen besseren Weg, aber ich habe das gerade ausgepeitscht:
public enum DateTimePart { Years, Months, Days, Hours, Minutes, Seconds };
public DateTime ChangeDateTimePart(DateTime dt, DateTimePart part, int newValue)
{
return new DateTime(
part == DateTimePart.Years ? newValue : dt.Year,
part == DateTimePart.Months ? newValue : dt.Month,
part == DateTimePart.Days ? newValue : dt.Day,
part == DateTimePart.Hours ? newValue : dt.Hour,
part == DateTimePart.Minutes ? newValue : dt.Minute,
part == DateTimePart.Seconds ? newValue : dt.Second
);
}
Ich bin gerade auf diesen Beitrag gestoßen, weil ich ein ähnliches Problem hatte, bei dem ich die Zeit für ein Entity Framework-Objekt in MVC festlegen wollte, das das Datum aus einer Ansicht (Datumsauswahl) abruft, sodass die Zeitkomponente 00:00:00 ist, aber ich brauche es soll die aktuelle Zeit sein. Basierend auf den Antworten in diesem Beitrag habe ich Folgendes gefunden:
myEntity.FromDate += DateTime.Now.TimeOfDay;
//The fastest way to copy time
DateTime justDate = new DateTime(2011, 1, 1); // 1/1/2011 12:00:00AM the date you will be adding time to, time ticks = 0
DateTime timeSource = new DateTime(1999, 2, 4, 10, 15, 30); // 2/4/1999 10:15:30AM - time tick = x
justDate = new DateTime(justDate.Date.Ticks + timeSource.TimeOfDay.Ticks);
Console.WriteLine(justDate); // 1/1/2011 10:15:30AM
Console.Read();
Sie können einem neuen DateTime
Wert auf viele verschiedene Arten einen Anfangswert zuweisen :
Erweiterungsmethode DateTime
public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds = default, int milliseconds = default)
{
return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, hours, minutes, seconds, milliseconds, dateTime.Kind);
}
dann mit ChangeTime
:
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.ChangeTime(12, 20, 10);
mit den Add-Methoden
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
mit der Zeitspanne
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
mit Anfangswert
DateTime datetime = DateTime.Now;
datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
Was ist falsch an der DateTime.AddSeconds-Methode, mit der Sie Sekunden hinzufügen oder entfernen können?
DateTime s;
//s = datevalue
s = s.AddMilliseconds(10);
s = s.AddMinutes(10);
s = s.AddSeconds(10);
s = s.AddHours(10);
Sie können dem Parameter + ve / -ve Werte hinzufügen.
s.Add(new TimeSpan(1, 1, 1));
Behebt das nicht deine Probleme?
Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);
Using an extencion to DateTime:
public enum eTimeFragment
{
hours,
minutes,
seconds,
milliseconds
}
public static DateTime ClearTimeFrom(this DateTime dateToClear, eTimeFragment etf)
{
DateTime dtRet = dateToClear;
switch (etf)
{
case eTimeFragment.hours:
dtRet = dateToClear.Date;
break;
case eTimeFragment.minutes:
dtRet = dateToClear.AddMinutes(dateToClear.Minute * -1);
dtRet = dtRet.ClearTimeFrom(eTimeFragment.seconds);
break;
case eTimeFragment.seconds:
dtRet = dateToClear.AddSeconds(dateToClear.Second * -1);
dtRet = dtRet.ClearTimeFrom(eTimeFragment.milliseconds);
break;
case eTimeFragment.milliseconds:
dtRet = dateToClear.AddMilliseconds(dateToClear.Millisecond * -1);
break;
}
return dtRet;
}
Verwenden Sie wie folgt:
Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))
Dies muss zurückkehren: 2016-06-06 00: 00: 00.000
Die beste Lösung ist:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
Hier ist ein Ghetto Weg, aber es funktioniert :)
DateTime dt = DateTime.Now; //get a DateTime variable for the example
string newSecondsValue = "00";
dt = Convert.ToDateTime(dt.ToString("MM/dd/yyyy hh:mm:" + newSecondsValue));
dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)
würde es aber nicht empfehlen.