2009-12-07 197 views

回答

470

您不能更改DateTime值 - 它是不可變的。但是,您可以將該變量更改爲具有新值。這樣做,要改變只是時間的最簡單的方法是創建相關的時間時間跨度,並使用DateTime.Date屬性:

DateTime s = ...; 
TimeSpan ts = new TimeSpan(10, 30, 0); 
s = s.Date + ts; 

s現在將是相同的日期,但在10:30。

請注意,DateTime無視夏令時轉換,表示兩個方向上的「天真」格里高利時間(請參閱DateTime docs中的備註部分)。唯一的例外是.Now.Today:它們檢索反映這些事件發生的當前系統時間。

這是一種促使我啓動Noda Time項目的產品,該項目現已投入生產。它的ZonedDateTime類型被製成「知道」by linking it to a tz database entry

+8

s.Date.Add(新的TimeSpan(0,0,0))也應該有效。在兩天之間進行檢查時使用它來清空時間。 – 2012-03-14 13:49:37

+7

@ user295734:你爲什麼要調用'Add'提供零時間跨度?你的表情等同於's.Date',但是更長... – 2012-03-14 14:21:23

+0

忘記糾正它,在我把它放入代碼之後意識到它設置爲零(我最初搜索的是)。但我只是試圖展示如何在一行中設置時間,如果不設置爲0. – 2012-03-14 14:44:32

0

DateTime.AddSeconds方法在哪裏可以添加或減少秒?

+0

不僅如此,但它聽起來並不像它回答了這個問題呢。我懷疑OP想要一個DateTime與日期相同但具體的時間 - 這隻會使用AddSeconds *相對*很難做到。 – 2009-12-07 10:54:27

57
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z); 

通過這種方式,您可以保留日期,同時插入新的小時,分​​鍾和秒鐘部分以滿足自己的喜好。

+0

@Webleeuw當然,根據添加的值,[ArgumentOutOfRangeException](http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx)的遠程可能性。這是一個[Pex](http://pexforfun.com/default.aspx?language=CSharp&sample=Y2k)益智演示。 – lifebalance 2013-10-31 16:03:14

+0

並根據用例,如果需要也可以執行'.AddMilliseconds()'。 – 2017-04-21 16:15:47

19

DateTime是不可變的類型,所以你不能更改它。

但是,您可以根據以前的實例創建新的DateTime實例。就你而言,這聽起來像你需要Date屬性,然後你可以添加一個TimeSpan來表示一天的時間。

事情是這樣的:

var newDt = s.Date + TimeSpan.FromHours(2); 
-1
DateTime s; 
//s = datevalue 
       s = s.AddMilliseconds(10); 
       s = s.AddMinutes(10); 
       s = s.AddSeconds(10); 
       s = s.AddHours(10); 

您可以添加+參數VE/-ve值。

s.Add(new TimeSpan(1, 1, 1)); 
+0

@mrnye:我沒有得到你。 – Saar 2009-12-07 11:07:22

+0

@Jon:我評論了這一行。用戶需要在使用此代碼之前分配一些值。 – Saar 2009-12-07 11:08:20

+0

@Saar:更重要的是,你*現在*將作業添加回s(除了調用s.Add(...))。 – 2009-12-07 11:24:56

0

當你構建你的DateTime對象,使用一個構造函數允許你指定時間:

var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42 

如果你已經有了一個DateTime對象,並希望改變的時候,uou可以加分,小時秒到你DateTime使用簡單的方法:

var myDateTime = new DateTime(2000, 01, 01);    // 2000-01-01 00:00:00 
myDateTime = myDateTime.AddHours(13);      // 2000-01-01 13:00:00 
myDateTime = myDateTime.AddMinutes(37);     // 2000-01-01 13:37:00 
myDateTime = myDateTime.AddSecounds(42);     // 2000-01-01 13:37:42 

通知我們如何「拯救」從每個方法C的結果全部轉到myDateTime變量。這是因爲DateTime是不可變的,它的方法只是創建新的實例,添加額外的小時/分鐘/秒。

如果您需要添加兩個小時和分鐘(和/或秒),並在同一時間,你可以通過添加TimeSpan到原來DateTime而不是簡化代碼:

var myDateTime = new DateTime(2000, 01, 01);    // 2000-01-01 00:00:00 
myDateTime += new TimeSpan(13, 37, 42);     // 2000-01-01 13:37:42 

如果你想設置絕對小時/ MINUES /秒,而不是添加到現有的值,可以使用上述DateTime構造和重用值年/月/日從早期:

myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day, 
          20, 33, 19)      // 2000-01-01 20:33:19 
+0

使用AddXXX方法進行加減運算 – 2009-12-07 10:53:44

-5

這裏是一個貧民區的方式,但這行得通s :)

DateTime dt = DateTime.Now; //get a DateTime variable for the example 
string newSecondsValue = "00"; 
dt = Convert.ToDateTime(dt.ToString("MM/dd/yyyy hh:mm:" + newSecondsValue)); 
+1

好吧,如果你碰巧在美國,它就會起作用...... – 2009-12-07 10:56:17

+5

相當不好,因爲各種原因不好 – Murph 2009-12-07 10:58:37

+0

另一個貧民窟的方式,但稍微乾淨一點就是隻玩秒。例如'dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)''但不會推薦它。 – mike 2009-12-07 11:06:22

0

這不能解決您的問題嗎?

Dateime dt = DateTime.Now; 
dt = dt.AddSeconds(10); 
81

好吧,我潛水與我的建議,一個擴展方法:

public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds, int milliseconds) 
{ 
    return new DateTime(
     dateTime.Year, 
     dateTime.Month, 
     dateTime.Day, 
     hours, 
     minutes, 
     seconds, 
     milliseconds, 
     dateTime.Kind); 
} 

然後調用:

DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0); 

重要的是要注意,這個擴充返回很重要日期對象,所以你不能這樣做:

DateTime myDate = DateTime.Now; 
myDate.ChangeTime(10,10,10,0); 

但你可以這樣做:

DateTime myDate = DateTime.Now; 
myDate = myDate.ChangeTime(10,10,10,0); 
+4

這與'Datetime.Today.Add(time.TimeOfDay)'基本相同。這是因爲在內部,構造函數不會執行任何基於日曆的更正,除非計算日期部分的閏年。即DateTime是Python的'datetime'模塊的一個「天真」實現。 – 2014-10-08 11:54:24

1

這裏是你可以用它來爲你做它,使用它像這樣

DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0); 

下面的方法是方法,有可能是一個更好的這樣,但我只是颳起這件事:

public enum DateTimePart { Years, Months, Days, Hours, Minutes, Seconds }; 
public DateTime ChangeDateTimePart(DateTime dt, DateTimePart part, int newValue) 
{ 
    return new DateTime(
     part == DateTimePart.Years ? newValue : dt.Year, 
     part == DateTimePart.Months ? newValue : dt.Month, 
     part == DateTimePart.Days ? newValue : dt.Day, 
     part == DateTimePart.Hours ? newValue : dt.Hour, 
     part == DateTimePart.Minutes ? newValue : dt.Minute, 
     part == DateTimePart.Seconds ? newValue : dt.Second 
     ); 
} 
1

我剛纔碰到過這個職位,因爲我也有過類似的問題,即我想設置的時間爲實體框架對象MVC從視圖(日期選擇器)獲取日期,所以時間組件是00:00:00,但我需要它是當前時間。基於這一職位的答案,我想出了:

myEntity.FromDate += DateTime.Now.TimeOfDay; 
7

偶然發現這個職位,因爲我一直在尋找相同的功能,這可能可能做的傢伙想要什麼。以原始日期和更換時間部分

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM"); 
1
//The fastest way to copy time    

DateTime justDate = new DateTime(2011, 1, 1); // 1/1/2011 12:00:00AM the date you will be adding time to, time ticks = 0 
DateTime timeSource = new DateTime(1999, 2, 4, 10, 15, 30); // 2/4/1999 10:15:30AM - time tick = x 

justDate = new DateTime(justDate.Date.Ticks + timeSource.TimeOfDay.Ticks); 

Console.WriteLine(justDate); // 1/1/2011 10:15:30AM 
Console.Read(); 
22

一個襯墊

var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0)); 

會帶回今天的日期用的4點三十分00秒時,任何日期代替DateTime.Now對象

13

如果已將時間存儲在另一個DateTime對象中,則可以使用Add方法。

DateTime dateToUse = DateTime.Now(); 
DateTime timeToUse = new DateTime(2012, 2, 4, 10, 15, 30); //10:15:30 AM 

DateTime dateWithRightTime = dateToUse.Date.Add(timeToUse.TimeOfDay); 

TimeOfDay屬性是一個TimeSpan對象,並且可以被傳遞到Add方法。由於我們使用dateToUse變量的Date屬性,我們只獲取日期並添加時間跨度。

2
int year = 2012; 
int month = 12; 
int day = 24; 
int hour = 0; 
int min = 0; 
int second = 23; 
DateTime dt = new DateTime(year, month, day, hour, min, second); 
-1

最好的解決辦法是:

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1); 
+1

起初我以爲這是錯誤的,但它有意義*如果*您將結果分配給DateTime對象。但這不是最好的解決方案。它要求你知道當前的時間部分,以便進行正確的計算,同時取日期的日期部分並添加最好的部分。 – ThunderGr 2013-12-09 10:47:26

+1

絕對不是「最好的」。遠離可讀性和重複使用的幻數。 – BartoszKP 2015-10-05 14:04:43

0

我更喜歡這樣的:

DateTime s = //get some datetime; 
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0); 
3

如果你有一個像2014年2月5日18點19分51秒日期時間和只想2014/02/05,你可以這樣做:

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day) 
6
DateTime ts = DateTime.Now; 
ts = new DateTime (ts.Year, ts.Month, ts.Day, 0, 0, 0) ; 
Console.WriteLine ("Today = " + ts.ToString("M/dd/yy HH:mm:ss")) ; 

執行日期: 今日= 9/04/15 00:00:00

2

將.Date添加到您的日期,將其設置爲午夜(00:00)。

MyDate.Date 

注意的equivavalent SQL是CONVERT(DATETIME, CONVERT(DATE, @MyDate))

是什麼讓這個方法好是它的兩個快速輸入,易於閱讀。獎金是沒有從字符串轉換。

I.e.要設置今天的日期至23:30,使用方法:

DateTime.Now.Date.AddHours(23).AddMinutes(30) 

當然,你可以用任何你選擇的日期更換DateTime.Now或指明MyDate。

0
Using an extencion to DateTime: 

     public enum eTimeFragment 
     { 
      hours, 
      minutes, 
      seconds, 
      milliseconds 
     } 
     public static DateTime ClearTimeFrom(this DateTime dateToClear, eTimeFragment etf) 
     { 
      DateTime dtRet = dateToClear; 
      switch (etf) 
      { 
       case eTimeFragment.hours: 
        dtRet = dateToClear.Date; 
        break; 
       case eTimeFragment.minutes: 
        dtRet = dateToClear.AddMinutes(dateToClear.Minute * -1); 
        dtRet = dtRet.ClearTimeFrom(eTimeFragment.seconds); 
        break; 
       case eTimeFragment.seconds: 
        dtRet = dateToClear.AddSeconds(dateToClear.Second * -1); 
        dtRet = dtRet.ClearTimeFrom(eTimeFragment.milliseconds); 
        break; 
       case eTimeFragment.milliseconds: 
        dtRet = dateToClear.AddMilliseconds(dateToClear.Millisecond * -1); 
        break; 
      } 
      return dtRet; 

     } 

使用這樣的:

Console.WriteLine(DateTime.Now.ClearTimeFrom(eTimeFragment.hours))

這必須返回: 2016年6月6日00:00:00.000

0

由於DateTime是不可變的,因此在需要更改日期組件時必須創建新實例。不幸的是,沒有內置的功能來設置DateTime實例的單個組件。

使用下面的擴展方法

public static DateTime SetPart(this DateTime dateTime, int? year, int? month, int? day, int? hour, int? minute, int? second) 
{ 
    return new DateTime(
     year ?? dateTime.Year, 
     month ?? dateTime.Month, 
     day ?? dateTime.Day, 
     hour ?? dateTime.Hour, 
     minute ?? dateTime.Minute, 
     second ?? dateTime.Second 
    ); 
} 

public static DateTime SetYear(this DateTime dateTime, int year) 
{ 
    return dateTime.SetPart(year, null, null, null, null, null); 
} 

public static DateTime SetMonth(this DateTime dateTime, int month) 
{ 
    return dateTime.SetPart(null, month, null, null, null, null); 
} 

public static DateTime SetDay(this DateTime dateTime, int day) 
{ 
    return dateTime.SetPart(null, null, day, null, null, null); 
} 

public static DateTime SetHour(this DateTime dateTime, int hour) 
{ 
    return dateTime.SetPart(null, null, null, hour, null, null); 
} 

public static DateTime SetMinute(this DateTime dateTime, int minute) 
{ 
    return dateTime.SetPart(null, null, null, null, minute, null); 
} 

public static DateTime SetSecond(this DateTime dateTime, int second) 
{ 
    return dateTime.SetPart(null, null, null, null, null, second); 
} 

您可以設置單獨的DateTime組件,如

var now = DateTime.Now; 

now.SetSecond(0); 
2

使用Date.Add並添加一個New TimeSpan與您要添加

DateTime dt = DateTime.Now 
dt.Date.Add(new TimeSpan(12,15,00)) 
1
新的時間

最簡單的解決方案:

DateTime s = new DateTime(datetime.Year, datetime.Month, datetime.Day, 8, 36, 44); 

如果你需要一個特定的日期和時間格式:

DateTime s = new DateTime(datetime.Year, datetime.Month, datetime.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss") 
-1

試試這個

var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/;