Подтвердить что ты не робот

Заменить дату или время в объекте DateTime в С#

У меня есть объект DateTime, который может содержать или не содержать некоторую информацию о дате/времени. При этом мне нужно заменить время новым моментом независимо от даты и наоборот. Как я могу это достичь? Я не вижу ничего очевидного, кроме создания двух новых объектов DateTime, один со старой/новой датой и со старым/новым временем и конкатенацией. Конечно, должен быть лучший способ, чем это?

4b9b3361

Ответ 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);