2014-01-07 4 views
3

Предположим, у меня есть DateTime:Есть ли лучший способ обрезать DateTime в C#?

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

Я хочу усечь это DateTime по differenct точности и возвращает минимальное DateTime как это:

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- от резкого до раунда-a-datetime-to-the-near-5-секунд), есть ответ с универсальным методом округления DateTime. –

+0

@ KonradKokosa Довольно точно это другое. Этот вопрос заключается в том, чтобы печатать все разные части, не делая их вручную. Возможно, с пользовательским форматом –

ответ

0

Это создает DateTime в полночь Today. Вы можете взять любое время DateTime и вызвать свойство «Дата», чтобы избавиться от часов/минут/секунд.

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

Оттуда, чтобы получить определенное время, как 5AM

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: выглядит как разумная отправная точка. Очевидно, что «первый день недели» является специфическим для культуры, и могут существовать разные правила для «года»/«финансового года»/«quoter» ... –

+0

Спасибо, хороший код. Одна мелочь заключается в том, что вы можете нарисовать dayofweek для int как 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); 
} 

Edit:

Пример использования: var truncated = dt.Truncate(Timespan.FromHours(1.0));

Как я уже говорил в этом комментарии, это не полезно для вещей, как лет и кварталам года, длина которого (математически) варьируется от экземпляра к экземпляру.

+0

как ddi вы определяете разрешение? – Gisway

+0

Мне нравится это решение, но в течение недели и выше оно не дает желаемого результата. – Magnus

+0

@ Magnus Что касается недель, они имеют фиксированную длину, 7 * 24 часа. Если вы используете мои методы в течение нескольких недель, важно, какой день недели был дата 01/янв./0001 в прорептическом григорианском календаре. Конечно же, как и 01 января/2001, и это было *** в понедельник ***. Надеемся, что все культуры мира могут согласиться, что понедельник - это первый день недели (!). –

Смежные вопросы