Замените раздел даты или времени в объекте DateTime в C#
У меня есть объект DateTime, который может или не может уже содержать некоторую информацию о дате / времени. При этом мне нужно заменить время на мое новое время независимо от даты и наоборот. Как мне этого достичь? Я не вижу ничего очевидного, кроме создания двух новых объектов DateTime, один со старой / новой датой и один со Старым / Новым временем и объединением. Должен же быть способ получше?
4 ответов
Я бы написал два или три метода расширения:
public static DateTime WithTime(this DateTime date, TimeSpan time)
{
return date.Date + time;
}
public static DateTime WithDate(this DateTime original, DateTime newDate)
{
return newDate.WithTime(original);
}
public static DateTime WithTime(this DateTime original, DateTime newTime)
{
return original.Date + newTime.TimeOfDay;
}
(вам действительно не нужны оба вторых метода, но иногда это может быть проще, если вы связываете вместе много вызовов.)
обратите внимание, что вы не создаете каких-либо объекты С точки зрения элементов в куче, как DateTime
является struct.
DateTime является неизменяемой структурой.
единственный вариант-построить новую структуру DateTime на основе ваших двух существующих значений. Это лучший подход. К счастью, это один лайнер:
DateTime CreateNewDateTime(DateTime date, DateTime time)
{
return new DateTime(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second);
}
удалите время из существующего datetime путем записи .Дата
DateTime new = oldDate.Date;
добавьте свое время, добавив часы, минуты и секунды по отдельности
DateTime new = oldDate.Date.AddHours(14).AddMinutes(12).AddSeconds(33);
или
DateTime new = oldDate.Date.AddSeconds(51153);
или добавив TimeSpan ()
DateTime new = oldDate.Date.Add(new TimeSpan(14,12,33));
Это не может быть ровно то, что вы ищете, но класс DateTime имеет ряд методов Add (AddMinutes (), AddDays () и т. д.). Я говорю, что это может быть не то, что вы ищете, потому что они возвращают DateTime, поэтому вам придется сделать что-то вроде
myDate = myDate.AddMinutes(60);