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

21

我的代码中使用了许多DateTime。我想将这些DateTime更改为特定的日期并保留时间。

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);

你使用什么公式来计算新的年、月和日,或者你只是试图将所有日期的日期部分与原始时间部分改为相同的日期部分? - Rufus L
另外,“不是好的方式”是什么意思?当前实现有什么问题? - Rufus L
1
虽然您的代码展示了如何创建新的日期时间对象,但它并没有展示您提问的背景。例如,您是想将它们以特定格式打印到控制台或屏幕上吗?第一部分的值从哪里获取?我相信,如果有更多信息,很多人都能正确地指导您。 - Louis Lewis
2个回答

35

保留秒、毫秒及更小的时间部分的更好方法是:

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

或者您可以创建一个扩展方法,将新日期应用于现有的 DateTime,并同时不信任新日期是否没有 TimeOfDay:

或者你可以创建一个扩展方法,在现有的 DateTime 上应用一个新的日期,并且同时不信任新日期是否缺少 TimeOfDay 属性:

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

在我看来,DateTime 是 .NET 中最薄弱的部分之一。例如,TimeSpan 并不同于 TimeOfDay,也无法表示“时间段”(以月为单位)——这是三个独立的概念,混淆它们是一个糟糕的选择。通常情况下,建议使用 DateTimeOffset 或出色的 Noda 时间库。


2
我进行了一些快速的基准测试,发现使用此方法所需的时间是使用 DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond) 构造函数所需时间的六分之一。而且比使用 newDate.Date.AddTicks(datetime.TimeOfDay.Ticks) 快约6%。因此,基本上就使用这个吧。 :) - Andrew
1
性能是值得关注的好事情,但是您应该考虑到您混合了日期类型。我建议测试DateKind来操作日期。 - Walter Verhoeven
请注意,此方法可能返回意外的“日期类型”。 - Augusto Barreto

15

根据您提供的信息,我认为这种方法是可行的。如果您想经常避免重写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);
    }
}

感谢grovesNL!你的辅助类是个好主意。所以,这个例子意味着在C#中没有任何方法可以做到这一点,对吗? - borrom
@borrom:是的,这是一个相当专业化的要求,因此我不会指望System.DateTime类默认包含这种方法。所有可能的DateTime构造函数都在MSDN条目中列出。 - grovesNL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接