根据给定日期计算当前或下一季度的第一个月和当前年度季度的最后一个月

时间:2013-08-05 18:39:16

标签: c#

考虑到我希望计算当前年度季度的日期。

如果今天的日期大于给定日期,我希望根据给定日期和下一季度的第一个月计算当前年度季度的最后一个月。

我经营的宿舍是jan-mar,apr-jun,jul-sep和oct-dec。

如果日期输入为01/10/2013,我希望输出为1月(下一季度的第一个月)和12月(当前年度季度的最后一个月)。在这种情况下,month变量将包含值10,而day变量将包含值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;

6 个答案:

答案 0 :(得分:4)

您可以使用整数数学获得当前季度。

int currentQuarter = ((month-1)/3)+1;

这是有效的,因为整数除法总是截断所以如果月份是1到3你将得到0到2超过3将等于0。月4到6将得到3-5超过3将等于1,依此类推。

对于给定的季度,第一个月和最后一个月将由:

int firstMonthOfQuarter = (quarter*3)-2;

int lastMonthOfQuarter = (quarter*3);

请注意,这些中的quarter将是您想要月份的季度。如果你想要当前的季度,那就用它。如果你想要下一个季度,那么做quarter+=1并检查溢出(即如果quarter是5那么它实际上是1)。或者,您可以将%12添加到第一个月和最后一个月的计算中,然后它将在五分之一的时间内正常工作。

int firstMonthOfQuarterOfNextQuarter = (((quarter+1)*3)-2)%12;
int lastMonthOfQuarterOfNextQuarter = ((quarter+1)*3)%12;

我对你如何把它放在一起感到很困惑,因为你要么想要当前的季度(如我的第一行所示),要么在某些情况下还需要下一个月的第一个月和最后一个月以及当前季度25美分硬币。如何归还这个我不知道所以你必须自己把它放在一起。

答案 1 :(得分:1)

如上所述,该算法提供了您想要的功能:

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的一维数组:当前季度的最后一个月的第一个位置和下一个季度的第一个月的第二个位置(或任何其他选择)。因此,包括主要功能(计算任何输入月份的目标值),但您必须根据您的具体要求进行调整。

答案 2 :(得分:0)

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);

答案 3 :(得分:0)

编写一个包装类,根据当前日期时间给出第一个月或上个月,并从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;
    }
}

答案 4 :(得分:0)

这些辅助方法应该为您提供所需的一切:

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 ;
    }
}

答案 5 :(得分:0)

您可以使用Time Period Library for .NET季度类:

// ----------------------------------------------------------------------
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