2014-01-07 83 views
3

假設我有一個DateTime:有沒有更好的方法來截斷C#中的DateTime?

DateTime datetime(2013,11,08,17,45,23,300);//2013:11:08 17:45:23:300 

我要截斷這個日期由differenct準確性和返回最小日期時間是這樣的:

Year:   2013:01:01 00:00:00:000  
    Quarter:  2013:10:01 00:00:00:000 //Oct is first month of that quarter 
    Month:  2013:11:01 00:00:00:000 
    Week:   2013:11:03 00:00:00:000 // 3rd is Sunday of that week 
    Day:   2013:11:08 00:00:00:000 
    Hours   2013:11:08 17:00:00:000 
    Minute:  2013:11:08 17:45:00:000 
    Second:  2013:11:08 17:45:23:000 

我知道你可以通過改變不同的部分做DateTime,有沒有更好的方法來做到這一點?或者在.net中已經有一個函數,我不知道?

+1

我可以添加一個簡單的評論。本季度,今年不會是「2012年」嗎?至於這個問題什麼是「常規」方式? – Nico

+0

可能的重複[在C#中有更好的方法來將DateTime四捨五入到最接近的5秒?](http://stackoverflow.com/questions/766626/is-there-a-better-way-in-c-日期時間到最近的5秒鐘),使用通用的「日期時間」舍入方法有一個答案。 –

+0

@KonradKokosa很確定這是不同的。這個問題是關於打印所有不同的部分,而不是每個人都手動完成。也許用自定義格式 –

回答

0

這會在Today的午夜創建DateTime。您可以使用任何DateTime並調用'Date'屬性來擺脫小時/分鐘/秒。

// 1/7/2014 12:00:00 AM 
DateTime.Now.Date 

從那裏得到一個特定的時間像凌晨5點

var 5amDate = DateTime.Now.Date.AddHours(5) 
// 1/7/2014 5:00:00 AM 
4

這裏沒有一個是我知道的,但是這應該做的伎倆:

public enum Accuracy { Year, Quarter, Month, Week, Day, Hour, Minute, Second}; 

private static DateTime TruncateDate(DateTime inDate, Accuracy accuracy){ 
     switch (accuracy) 
     { 
      case Accuracy.Year: 
       return new DateTime(inDate.Year, 1, 1); 
      case Accuracy.Quarter: 
       int i = inDate.Month % 3; 
       return new DateTime(inDate.Year, inDate.Month - i + 1, 1); 
      case Accuracy.Month: 
       return new DateTime(inDate.Year, inDate.Month, 1); 
      case Accuracy.Week: 
       return new DateTime(inDate.Year, inDate.Month, inDate.Day).AddDays(-(int)inDate.DayOfWeek); 
      case Accuracy.Day: 
       return new DateTime(inDate.Year, inDate.Month, inDate.Day); 
      case Accuracy.Hour: 
       return new DateTime(inDate.Year, inDate.Month, inDate.Day, inDate.Hour, 0, 0); 
      case Accuracy.Minute: 
       return new DateTime(inDate.Year, inDate.Month, inDate.Day, inDate.Hour, inDate.Minute, 0); 
      case Accuracy.Second: 
       return new DateTime(inDate.Year, inDate.Month, inDate.Day, inDate.Hour, inDate.Minute, inDate.Second); 
      default: 
       throw new ArgumentOutOfRangeException("accuracy"); 
     } 
    } 

編輯:更正因爲星期日是在不同的月份。

+1

+1:看起來像合理的起點。很明顯,「一週的第一天」是文化特定的,「年」/「財政年度」/「報價單」可能有不同的規則...... –

+0

謝謝你,好的代碼。一件小事是你可以將dayofweek轉換爲int,就像(int)inDate.DayofWeek – Gisway

+0

我將把這個轉換放在代碼中。 :-) 謝謝。 – Xinbi

1

根據我自己的評論:

public static DateTime Truncate(this DateTime dt, TimeSpan resolution) 
{ 
    return new DateTime(dt.Ticks - dt.Ticks % resolution.Ticks); 
} 

編輯:

使用例:var truncated = dt.Truncate(Timespan.FromHours(1.0));

當我在評論說,這是沒有用的東西,如年,季一年的長度(數學)在不同的實例中有所不同。

+0

你是如何定義分辨率的? – Gisway

+0

我喜歡這個解決方案,但是對於一週或更長時間,它並不能提供所需的結果。 – Magnus

+0

@Magnus關於周,他們有一個固定的長度,7 * 24小時。如果您在幾周內使用我的方法,那麼重要的公曆日曆中的日期是01/Jan/0001。當然和01/Jan/2001一樣,那是***星期一***。希望世界上所有的文化都可以認同星期一是一週中的第一天(!)。 –

相關問題