2014-11-03 93 views
10

我在我的代碼中使用了很多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); 
+0

你用什麼公式計算新年,月和日,還是隻是試圖將所有日期更改爲與原始時間部分具有相同的日期部分? – 2014-11-03 03:59:43

+0

另外,「不好」的意思是什麼?目前的實施有什麼問題? – 2014-11-03 04:01:11

+1

儘管代碼確實顯示瞭如何創建新的日期時間對象,但它並未顯示問題的上下文。例如,你是否試圖以特定的格式將它們打印到控制檯或屏幕上?你從哪裏獲得價值的第一部分?我確信有了更多的信息,很多人都能夠正確地引導你 – 2014-11-03 04:04:46

回答

11

根據您提供的信息,我認爲這種方法很好。如果您想避免經常重寫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); 
    } 
} 
+0

謝謝grovesNL!你的助手類是一個好主意。那麼這個例子就意味着在c#中沒有任何方法可以做到這一點? – borrom 2014-11-03 04:23:23

+0

@borrom:是的,這是一個相當專業的請求,所以我不希望System.DateTime類默認包含這種方法。 [MSDN條目](http://msdn.microsoft.com/zh-cn/library/system.datetime(v = vs.110).aspx)中列出了所有可能的DateTime構造函數。 – grovesNL 2014-11-03 04:25:59

12

它保留了秒,毫秒的時間會更小的部分更好的辦法:

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

或者你可以做一個擴展方法到一個新的日期適用於現有的日期時間,並在同一時間,不相信新的日期是沒有上它的TimeOfDay: -

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

恕我直言DateTime是.NET的最薄弱環節之一。例如,TimeSpanTimeOfDay不同,也不能代表'TimePeriod'(幾個月) - 這是三個單獨的概念,將它們混合起來是一個糟糕的選擇。通常優選移動到DateTimeOffset或優秀的Noda時間庫。

+0

@Lan Mercer。 它的工作發現!在我嘗試你的代碼之後。謝謝 – borrom 2014-11-03 06:00:51

+0

我做了一些快速基準測試,發現這個方法佔用了'DateTime(int year,int month,int day,int hour,int minute,int second,int millisecond)'構造函數的1/6時間。它比使用'newDate.Date.AddTicks(datetime.TimeOfDay.Ticks)'快6%。所以基本上,使用這個。 :) – Andrew 2016-12-14 07:52:09

相關問題