У меня есть объект DateTime, который может содержать или не содержать некоторую информацию о дате/времени. При этом мне нужно заменить время новым моментом независимо от даты и наоборот. Как я могу это достичь? Я не вижу ничего очевидного, кроме создания двух новых объектов DateTime, один со старой/новой датой и со старым/новым временем и конкатенацией. Конечно, должен быть лучший способ, чем это?
Заменить дату или время в объекте DateTime в С#
Ответ 1
Я бы написал два или три метода расширения:
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
является структурой.
Ответ 2
DateTime - неизменяемая структура.
Единственная опция - создать новую структуру DateTime, основанную на двух существующих значениях. Это лучший подход. К счастью, это один лайнер:
DateTime CreateNewDateTime(DateTime date, DateTime time)
{
return new DateTime(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second);
}
Ответ 3
Разделите время из существующего datetime, написав .Date
DateTime new = oldDate.Date;
Добавьте свой TIme, добавив часы, минуты и секунды в отдельности
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));
Ответ 4
Это не может быть точно, что вы ищете, но класс DateTime имеет ряд методов Add (AddMinutes(), AddDays() и т.д.). Я говорю, что это может быть не то, что вы ищете, потому что они возвращают DateTime, поэтому вам нужно будет сделать что-то вроде
myDate = myDate.AddMinutes(60);