Получение количества месяцев по дням в c # - PullRequest
1 голос
/ 29 июля 2011

Я застрял, пытаясь понять это ..

В настоящее время у нас есть критерии даты в наших отчетах, которые ограничены днями, настраиваемые, конечно, в настоящее время равны 90 дням. В сообщении говорится, что оно ограничено 90 днями, однако мой начальник хочет увеличить его до 13 месяцев. К сожалению, если бы я сделал это, мне нужно было бы сделать это по дням, и было бы сказано, 395 дней ..

Не очень дружелюбное сообщение ..

Пытаясь найти способ удовлетворить это, другой мой единственный вариант - добавить другие настройки, ограниченные месяцами, а также днями. но тогда мне все еще нужно преобразовать месяцы обратно в дни, которые не будут идеальными, поскольку не каждый месяц имеет одни и те же дни.

Идеи

Ответы [ 4 ]

3 голосов
/ 29 июля 2011

Вам необходимо решить, будете ли вы использовать 13 месяцев в качестве временного интервала или какое-то количество дней, которое приближается к 13 месяцам.Если вы используете 13 месяцев, то количество дней (или дата окончания вашего отчета) будет варьироваться в зависимости от даты начала.

Я бы предложил сделать ваш отчет настраиваемым на месяцы или дни (сохранениене только количество, но и единицы в конфигурации).Затем вы можете отобразить в отчете все, что было указано в конфигурации (также с единицами измерения из конфигурации) и рассчитать дату окончания запроса, добавив настроенное количество настроенных единиц к дате начала.

Если вы попытаетесь сделать все за несколько дней, то, когда вы сейчас работаете за месяцы, вы просто усложните себе жизнь.

Гораздо проще добавить 13 месяцев к дате начала, чтобы получить дату окончания, чем пытаться и (неточно) определить, сколько месяцев в данном количестве дней.

1 голос
/ 29 июля 2011

Используйте объект TimeSpan , чтобы выполнить вычисления, необходимые для критериев даты.

0 голосов
/ 29 июля 2011

TimeSpan дает вам продолжительность между двумя DateTime объектами. Это может дать это последовательно в Днях, Часах или Минутах; Количество месяцев будет отличаться в зависимости от фактических дат начала и окончания, так как разные месяцы имеют разное количество фактических дней.

Сказав это, вы всегда можете написать метод Utility, который дает вам YourTimeSpan объект, который дает вам количество месяцев и т. Д. На основе вашего календаря и StartDate / EndDates.

В вашем случае вы можете сделать это еще проще, сохранив его отдельно в конфигурации, например - ReportDuration_Years, ReportDuration_Months, ReportDuration_Days. Это позволит вам создать значимую метку в отчете, а также позволит правильно идентифицировать StartDate и EndDate.

//Call this by passing values from configuration
private string GetNiceLookingLable(int? years, int? months, int? days){
    var yearMessage = (years.HasValue)?String.Format("{0} Years", years):String.Empty;
    var monthMessage = (months.HasValue)?String.Format("{0} Months", months):String.Empty;
    var daysMessage = (days.HasValue)?String.Format("{0} Days", days):String.Empty;

    // You probably want to concatenate them properly
    return String.Format("{0} {1} {2}",yearMessage, monthMessage, daysMessage);
}

-

//Call this to get starting date
private DateTime getStartingDate(int? years, int? months,int? days){
     var retDate = DateTime.Today;
     if(years.HasValue){
         retDate = retDate.AddYears(-1*years.Value);
     }
     if(months.HasValue){
         retDate = retDate.AddMonths(-1*months.Value);
     }
     if(days.HasValue){
         retDate = retDate.AddDays(-1*days.Value);
     }

     return retDate;
}
0 голосов
/ 29 июля 2011

Я бы сделал что-то подобное, учитывая количество дней:

int myDays;   // 390 or whatever
DateTime d1 = DateTime.Now;
DateTime d2 = d1.AddDays(myDays);
int monthsDiff = d2.Month - d1.Month + 12 * (d2.Year - d1.Year);
DateTime d3 = d1.AddMonths(monthsDiff);
TimeSpan tf = d2 - d3;
string msg = monthsDiff.ToString() + " months, " + tf.Days + " days";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...