Замените раздел даты или времени в объекте 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);