Как изменить только часть даты DateTime, сохраняя временную часть?

Я использую много DateTime в своем коде. Я хочу изменить эти DateTimes на мою конкретную дату и сохранить время.

1. "2012/02/02 06:00:00" => "2015/12/12 : 06:00:00"
2. "2013/02/02 12:00:00" => "2015/12/12 : 12:00:00"

Я использую этот стиль для изменения, но это не очень хороший способ, и я хочу спросить, есть ли способ достичь этой задачи.

DateTime newDateTime = new DateTime(2015,12,12,oldDateTime.Hour,oldDateTime.Minute,0);

Ответ 1

С предоставленной вами информацией, я думаю, что этот метод в порядке. Если вы не хотите часто переписывать часть oldDateTime.Hour,oldDateTime.Minute,0, вы можете создать свой собственный статический класс, чтобы упростить вызовы методов.

В вашем обычном приложении:

class Program
{
    static void Main(string[] args)
    {
        DateTime time = DateTime.Now;
        DateTime newDateTime = MyDateTimeUtil.CreateDateFromTime(2015, 12, 12, time);
    }
}

Статический класс, создающий значение DateTime:

public static class MyDateTimeUtil
{
    public static DateTime CreateDateFromTime(int year, int month, int day, DateTime time)
    {
        return new DateTime(year, month, day, time.Hour, time.Minute, 0);
    }
}

Ответ 2

Лучший способ сохранения секунд, миллисекунд и меньших частей времени:

DateTime newDateTime = new DateTime(2015,12,12) + oldDateTime.TimeOfDay;

Или вы можете сделать метод расширения для применения новой даты к существующему DateTime и в то же время не доверять новой дате без использования TimeOfDay: -

public static DateTime WithDate (this DateTime datetime, DateTime newDate)
{
   return newDate.Date + datetime.TimeOfDay;
}

IMHO DateTime - одна из самых слабых частей .NET. Например, a TimeSpan не совпадает с TimeOfDay и не может представлять "TimePeriod" (в месяцах) - это три отдельные концепции, и их смешивание было плохим выбором. Перемещение на DateTimeOffset обычно является предпочтительным или отличной библиотекой времени Noda.