如何在保留时间部分的同时仅更改DateTime的日期部分?

bor*_*rom 15 c# 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"
Run Code Online (Sandbox Code Playgroud)

我使用这种风格来改变,但它似乎不是好方法,我想问有什么办法来实现这个任务.

DateTime newDateTime = new DateTime(2015,12,12,oldDateTime.Hour,oldDateTime.Minute,0);
Run Code Online (Sandbox Code Playgroud)

Ian*_*cer 20

保留秒,毫秒和较小部分时间的更好方法是:

DateTime newDateTime = new DateTime(2015,12,12) + oldDateTime.TimeOfDay;
Run Code Online (Sandbox Code Playgroud)

或者您可以使用扩展方法将新Date应用于现有DateTime,同时不信任新日期没有TimeOfDay: -

public static DateTime WithDate (this DateTime datetime, DateTime newDate)
{
   return newDate.Date + datetime.TimeOfDay;
}
Run Code Online (Sandbox Code Playgroud)

恕我直言DateTime是.NET最薄弱的部分之一.例如,a TimeSpan与a不同TimeOfDay也不能代表'TimePeriod'(以月计) - 这是三个独立的概念,将它们混合起来是一个糟糕的选择.移动到DateTimeOffset一般是首选或优秀的Noda时间库.

  • 我做了一些快速的基准测试,发现使用`DateTime(int year,int month,int day,int hour,int minute,int second,int millisecond)`构造函数需要花费1/6的时间.它也比使用`newDate.Date.AddTicks(datetime.TimeOfDay.Ticks)`快约6%.所以基本上,使用这个.:) (2认同)

gro*_*sNL 14

根据您提供的信息,我认为这种方法很好.如果您想避免oldDateTime.Hour,oldDateTime.Minute,0经常重写片段,可以创建自己的静态类来简化方法调用.

在您的常规申请中:

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

创建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);
    }
}
Run Code Online (Sandbox Code Playgroud)