根据给定日期计算当前或下一个年度季度的第一个月和当前年度季度的最后一个月
本文关键字:季度 第一个 最后一个 日期 计算 下一个 | 更新日期: 2023-09-27 18:26:27
给定一个日期,我希望计算当前年度季度。
如果今天的日期大于给定日期,我希望根据给定日期计算当前年度季度的最后一个月和下一个年度季度的第一个月。
我经营的宿舍是一月、四月、七月和十月。
如果输入日期为2013年10月1日,我希望输出为1月(下一年度季度的第一个月)和12月(当前年度季度的最后一个月)。在这种情况下,月份变量将包含值10,而日期变量将包含数值1。
到目前为止我的尝试:
每个季度的最后一个月
if (month % 3 == 0)
month += (DateTime.Now.Day > day ? 3 : 0);
if (month % 3 == 1)
month += 2;
if (month % 3 == 2)
month += 1;
每个季度的第一个月
if (month % 3 == 1) // jan/mapr/jul/oct
month += (DateTime.Now.Day > day ? 3 : 0);
if (month % 3 == 2) // feb/may/aug/nov
month += 2;
if (month % 3 == 0) // mar/jun/sep/dec
month += 1;
您可以使用整数数学来获得当前季度。
int currentQuarter = ((month-1)/3)+1;
这是因为整数除法总是截断的,所以如果月份是1到3,你会得到0到2,而3等于0。第4个月至第6个月将给出3比5,这将等于1,依此类推
对于给定的季度,第一个月和最后一个月将由给出
int firstMonthOfQuarter = (quarter*3)-2;
和
int lastMonthOfQuarter = (quarter*3);
请注意,其中的quarter
将是您想要的月份的季度。如果您想要当前季度,请使用该季度。如果你想要下一个季度,那么做quarter+=1
并检查溢出(即,如果季度是5,那么它实际上是1)。或者,您可以将%12
添加到第一个月和最后一个月的计算中,然后它将在5的四分之一时正常工作。
int firstMonthOfQuarterOfNextQuarter = (((quarter+1)*3)-2)%12;
int lastMonthOfQuarterOfNextQuarter = ((quarter+1)*3)%12;
我有点困惑,你想怎么把它组合在一起,因为你要么想要当前季度(如我的第一行所示),要么在某些情况下额外想要下一个月和当前季度的第一个月和最后一个月。我不知道你是怎么还的,所以你必须自己把它整理好。
如前所述,该算法提供了您想要的功能:
int quarterCurr = 1;
if (Convert.ToDouble(curMonth) / 3.0 > 1.0)
{
quarterCurr = Convert.ToInt32(Convert.ToDouble(curMonth) / 3.0);
if (curMonth % 3 != 0)
{
quarterCurr = quarterCurr + 1;
}
}
int firstMonthCurr = 3 * (quarterCurr - 1) + 1;
int lastMonthCurr = 3 * quarterCurr;
int quarterNext = quarterCurr + 1;
if (quarterNext > 4)
{
quarterNext = 1;
}
int firstMonthNext = 3 * (quarterNext - 1) + 1;
这是一种简单/清晰的方法来计算您需要的所有信息:每个季度的第一个月/最后一个月。
此代码应放在一个函数中,该函数将在需要时调用。它将只接受当前月份作为输入,并返回长度为2的1D数组:当前季度最后一个月的第一个位置和下一季度第一个月的第二个位置(或任何其他选择)。因此,包括了主要功能(计算任何输入月份的目标值),但您必须根据自己的确切需求进行调整。
var currentDate = DateTime.Now;
var quarterNumber = ((currentDate.Month-1)/3) + 1;
var firstDayOfQuarter = new DateTime(currentDate.Year, ((quarterNumber-1) * 3) + 1, 1);
var lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1);
编写一个包装类,根据当前日期时间给出第一个月或最后一个月,并从CurrentCulture设置中给出月份名称
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Quater.GetFirstMonth(DateTime.Now.Month)); // Outputs october
Console.WriteLine(Quater.GetLastMonth(DateTime.Now.Month)); // Outputs september
Console.ReadLine();
}
}
public static class Quater
{
public static string GetFirstMonth(int month)
{
if (month >= 1 && month <= 3) {
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(4);
}
if (month >= 4 && month <= 6) {
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(7);
}
if (month >= 7 && month <= 9) {
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(10);
}
if (month >= 10 && month <= 12) {
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(1);
}
return string.Empty;
}
public static string GetLastMonth(int month)
{
if (month >= 1 && month <= 3)
{
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(3);
}
if (month >= 4 && month <= 6)
{
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(6);
}
if (month >= 7 && month <= 9)
{
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(9);
}
if (month >= 10 && month <= 12)
{
return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(12);
}
return string.Empty;
}
}
这些辅助方法应该为您提供所需的一切:
public static class DateTimeHelpers
{
private static DateTime StartDateOfCurrentQuarter( DateTime instant )
{
return new DateTime( instant.Year , 1 + 3*((instant.Month-1)/3) , 1 ) ;
}
public static void CurrentQuarter( this DateTime instant , out DateTime start , out DateTime end )
{
start = StartDateOfCurrentQuarter(instant) ;
end = start.AddMonths(3).AddTicks(-1) ;
return ;
}
public static void NextQuarter( this DateTime instant , out DateTime start , out DateTime end )
{
start = StartDateOfCurrentQuarter(instant).AddMonths(3) ;
end = start.AddMonths(3).AddTicks(-1) ;
return ;
}
public static void PrevQuarter( this DateTime instant , out DateTime start , out DateTime end )
{
start = StartDateOfCurrentQuarter(instant).AddMonths(-3) ;
end = start.AddMonths(3).AddTicks(-1) ;
return ;
}
}
您可以使用.NET:的时间段库的Quarter类
// ----------------------------------------------------------------------
public void QuarterStartEndMonth()
{
DateTime now = DateTime.Now;
Quarter pastQuarter = GetQuarter( new DateTime( now.Year - 1, 10, 1 ) );
Console.WriteLine( "Quarter last month {0:d}", pastQuarter.LastMonthStart );
Console.WriteLine( "Next quarter start month {0:d}",
pastQuarter.GetNextQuarter().Start );
Quarter futureQuarter = GetQuarter( new DateTime( now.Year + 1, 10, 1 ) );
Console.WriteLine( "Quarter last month {0:d}", futureQuarter.LastMonthStart );
Console.WriteLine( "Next quarter start month {0:d}",
futureQuarter.GetNextQuarter().Start );
} // QuarterStartEndMonth
// ----------------------------------------------------------------------
private Quarter GetQuarter( DateTime moment )
{
DateTime now = DateTime.Now;
return new Quarter( now > moment ? now : moment );
} // GetQuarter