2011-04-04 69 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