2011-04-04 35 views
1

我有一個C#類作爲銷售報告引擎。所以基本上它取決於數據庫中的數據取決於用戶選擇的日期範圍。C#類選擇當前季度而不是上一季度的日期

用戶可以按兩種方式選擇日期 - 按特定日期範圍或按季度(即當前季度,上一季度)。

當系統移交給我們時,上一季度選項功能正常,但現在它只是獲取與當前季度相同的日期(我不確定爲什麼,本部分的源代碼沒有更改完全)。

我一直在尋找它的年齡試圖找出發生了什麼事情,因爲正如我所說,它確實在以前正常工作。我希望有一雙新鮮的眼睛可以幫助嗎?我通過代碼進行了調試,當我選擇GetPreviousQuarter時,它只計算GetCurrentQuarterDates。

下面是switch語句當用戶選擇按季度來查看信息被稱爲:

switch (reportRequest.SelectedPeriod) 
{ 
    case SalesReportRequest.SalesReportPeriod.Today: // Today 
     startDate = DateTime.Today; 
     endDate = DateTime.Today.Add(new TimeSpan(0, 23, 59, 59, 59)); 
     break; 
    case SalesReportRequest.SalesReportPeriod.Yesterday: 
     startDate = DateTime.Today.AddDays(-1); 
     endDate = DateTime.Today.AddDays(-1).Add(new TimeSpan(0, 23, 59, 59, 59)); 
     break; 
    case SalesReportRequest.SalesReportPeriod.Last7Days: 
     ReportDateRange dr3 = GetDatesOfLastSevenDays(); 
     startDate = dr3.StartDate; 
     endDate = dr3.EndDate; 
     break; 
    case SalesReportRequest.SalesReportPeriod.CurrentQuarter: // Current Quarter. 
     ReportDateRange dr = GetDatesOfCurrentQuarter(); 
     startDate = dr.StartDate; 
     endDate = dr.EndDate; 
     break; 
    case SalesReportRequest.SalesReportPeriod.PreviousQuarter: // Previous Quarter. 
     ReportDateRange dr1 = GetDatesOfPreviousQuarter(); 
     startDate = dr1.StartDate; 
     endDate = dr1.EndDate; 
     break; 
    case SalesReportRequest.SalesReportPeriod.CurrentYear: // Current Year. 
     ReportDateRange dr2 = GetDatesOfCurrentYear(); 
     startDate = dr2.StartDate; 
     endDate = dr2.EndDate; 
     break; 
} 

所以後來選擇了上一季度的選項時,GetDatesOfPreviousQuarter()被調用:

public ReportDateRange GetDatesOfPreviousQuarter() 
{ 
    var dtmValue = DateTime.Now; 
    return DatesOfQuarter(dtmValue); 
} 

這就要求DatesOfQuarter:

public ReportDateRange DatesOfQuarter(DateTime dtmValue) 
{ 
    var intQuarter = (int)Math.Ceiling(dtmValue.Month/3M); 

    var intLastMonthOfQuarter = intQuarter * 3; 
    var intFirstMonthOfQuarter = intLastMonthOfQuarter - 2; 
    var intLastDayOfQuarter = DateTime.DaysInMonth(dtmValue.Year, intLastMonthOfQuarter); 

    ReportDateRange dateRange = new ReportDateRange 
    { 
     StartDate = new DateTime(dtmValue.Year, intFirstMonthOfQuarter, 1), 
     EndDate = new DateTime(dtmValue.Year, intLastMonthOfQuarter, intLastDayOfQuarter) 
    }; 

    return dateRange; 
} 

任何幫助我很欣賞,如果需要,我可以提供更多信息。

謝謝。

編輯:

只是因爲有些人問它:

public ReportDateRange GetDatesOfCurrentQuarter() 
    { 
     var dtmValue = DateTime.Now; 
     return DatesOfQuarter(dtmValue); 
    } 
+0

爲'GetDatesOfPreviousQuarter'和'DatesOfQuarter'看起來都正確,以我的代碼。你是否獲得了最初請求的正確的'reportRequest.SelectedPeriod'? – Stuart 2011-04-04 10:30:44

+0

是的,在這個階段我已經將它檢查了近三倍,一切都應該如此。我確實嘗試了之前發佈的DateTime.Now.AddMonths(-3),這似乎挑出了正確的日期。仍然沒有解決它之前的工作方式的神祕感:S – 109221793 2011-04-04 10:33:45

+0

評論刪除 - 忽略我...我瘋了 - 對不起!在這個代碼中有一些簡單的東西... – Stuart 2011-04-04 10:34:04

回答

1

你能也張貼GetDatesOfCurrentQuarter的代碼?

我的猜測是,一個簡單的解決可能會發生變化:

public ReportDateRange GetDatesOfPreviousQuarter() 
{ 
    var dtmValue = DateTime.Now; 
    return DatesOfQuarter(dtmValue); 
} 

public ReportDateRange GetDatesOfPreviousQuarter() 
{ 
    var dtmValue = DateTime.Now.AddMonths(-3); 
    return DatesOfQuarter(dtmValue); 
} 
+0

嗨,斯圖爾特,我想這只是這樣簡單的事情,但我無法理解它是如何工作的(我已經被告知無論如何 - 我沒有創建系統):​​S ... GetDatesOfCurrentQuarter是實際上與GetDatesOfPreviousQuarter完全相同,這也令人困惑。無論如何,我會試試你的答案,謝謝你的回覆:) – 109221793 2011-04-04 10:29:02

+0

另外...在這裏要小心點...檢查誰在帳戶裏有關你的季度開始/結束的時間 - 有時帳戶可以改變季度開始/結束日期,因爲週末,節假日等! – Stuart 2011-04-04 11:33:37

1

編輯:在你編輯的問題現在很明顯的是,GetDatesOfCurrenQuarter()方法和GetDatesOfPreviousQuarter()方法是相同。

問題是GetDatesOfPreviousQuarter()方法不正確地調用DatesOfQuarter()方法當前日期。

你的季度計算是正確的。 M正確識別作爲天花板調整的小數的股息。計算Ceiling用於「向上舍入」整數。隨後將其轉換爲日期時間所屬的正確Quarter的int值。

換句話說:DatesOfQuarter方法將正確地返回一個結構,其中包含提供日期所屬季度的開始和結束日期。

我認爲,解決問題的方法是有以下兩種方法:

public ReportDateRange GetDatesOfCurrentQuarter() 
{  
     var dtmValue = DateTime.Now;  
     return DatesOfQuarter(dtmValue); 
} 

public ReportDateRange GetDatesOfPreviousQuarter() 
{  
     var dtmValue = DateTime.Now;  
     return DatesOfQuarter(dtmValue.AddMonths(-3)); 
} 

它超出了SO社會的洞察力,以確定是否該代碼從未真正工作或是否這是一個錯誤最近由設法隱藏他的蹤跡的同事介紹(並且由於邏輯錯誤而拒絕參與)

0

article類包括各種日曆期間像周,月,季,Halfyear:

// ---------------------------------------------------------------------- 
public void CalendarYearTimePeriodsSample() 
{ 
    DateTime moment = new DateTime(2011, 8, 15); 
    Console.WriteLine("Calendar Periods of {0}:", moment.ToShortDateString()); 
    // > Calendar Periods of 15.08.2011: 
    Console.WriteLine("Year  : {0}", new Year(moment)); 
    Console.WriteLine("Halfyear : {0}", new Halfyear(moment)); 
    Console.WriteLine("Quarter : {0}", new Quarter(moment)); 
    Console.WriteLine("Month : {0}", new Month(moment)); 
    Console.WriteLine("Week  : {0}", new Week(moment)); 
    Console.WriteLine("Day  : {0}", new Day(moment)); 
    Console.WriteLine("Hour  : {0}", new Hour(moment)); 
    // > Year  : 2011; 01.01.2011 - 31.12.2011 | 364.23:59 
    // > Halfyear : HY2 2011; 01.07.2011 - 31.12.2011 | 183.23:59 
    // > Quarter : Q3 2011; 01.07.2011 - 30.09.2011 | 91.23:59 
    // > Month : August 2011; 01.08.2011 - 31.08.2011 | 30.23:59 
    // > Week  : w/c 33 2011; 15.08.2011 - 21.08.2011 | 6.23:59 
    // > Day  : Montag; 15.08.2011 - 15.08.2011 | 0.23:59 
    // > Hour  : 15.08.2011; 00:00 - 00:59 | 0.00:59 
} // CalendarYearTimePeriodsSample 

的計算是基於.NET CultureInfo.Calendar。任何時期提供GetNextXxxGetPreviousXxx方法:

// ---------------------------------------------------------------------- 
public void GetDaysOfPastQuarter(DateTime moment, 
     out DateTime firstDay, out DateTime lastDay) 
{ 
    TimeCalendar calendar = new TimeCalendar(
    new TimeCalendarConfig { YearBaseMonth = YearMonth.October }); 
    Quarter quarter = new Quarter(moment, calendar); 
    Quarter pastQuarter = quarter.GetPreviousQuarter(); 

    firstDay = pastQuarter.FirstDayStart; 
    lastDay = pastQuarter.LastDayStart; 
} // GetDaysOfPastQuarter 
相關問題