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

C# 根据给定日期计算当前或下一年度季度的第一个月和当前年度季度的最后一个月,c#,C#,给定一个日期,我希望计算当前的年度季度 如果今天的日期大于给定日期,我希望根据给定日期计算当前年度季度的最后一个月,以及下一年度季度的第一个月 我经营的季度为1-3月、4-6月、7-9月和10-12月 如果输入日期为2013年10月1日,我希望输出日期为1月(下一年度季度的第一个月)和12月(当前年度季度的最后一个月)。在这种情况下,月变量将包含值10,日变量将包含值1 我迄今为止的努力: 每个季度的最后一个月 if (month % 3 == 0) month += (DateTime.N

给定一个日期,我希望计算当前的年度季度


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

我经营的季度为1-3月、4-6月、7-9月和10-12月

如果输入日期为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;
每个季度的第一个月

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;

请注意,其中的
季度
将是您希望月份的季度。如果您想要当前季度,请使用该季度。如果您想要下一个季度,则执行
quarter+=1
并检查溢出(即如果季度为5,则实际为1)。或者,您可以将
%12
添加到第一个月和最后一个月的计算中,然后使用四分之一的5就可以了

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

我有点困惑,你想如何把这些放在一起,因为你要么想要当前季度(如我的第一行所示),要么在某些情况下额外想要下一季度和当前季度的第一个月和最后一个月。我不知道您是如何返回的,因此您必须自己将其组合起来。

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

int currentQuarter = ((month-1)/3)+1;
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);
这是因为整数除法总是会被截断,所以如果月份是1到3,你会得到0到2除以3等于0。从第4个月到第6个月,3比5等于1,以此类推

对于给定的季度,第一个月和最后一个月将由以下人员给出:

int firstMonthOfQuarter = (quarter*3)-2;

请注意,其中的
季度
将是您希望月份的季度。如果您想要当前季度,请使用该季度。如果您想要下一个季度,则执行
quarter+=1
并检查溢出(即如果季度为5,则实际为1)。或者,您可以将
%12
添加到第一个月和最后一个月的计算中,然后使用四分之一的5就可以了

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

我有点困惑,你想如何把这些放在一起,因为你要么想要当前季度(如我的第一行所示),要么在某些情况下额外想要下一季度和当前季度的第一个月和最后一个月。我不知道您是如何返回的,因此您必须自己将其组合起来。

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

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);
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数组:当前季度最后一个月的第一个位置和下一季度第一个月的第二个位置(或任何其他替代)。因此,主要功能(计算任何输入月份的目标值)包括在内,但您必须使其适应您的确切需求。

如前所述,此算法提供您想要的功能:

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

编写一个包装类,根据当前日期时间给出第一个月或最后一个月,并根据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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
Console.WriteLine(Quater.GetFirstMonth(DateTime.Now.Month));//输出十月
Console.WriteLine(Quater.getlastmount(DateTime.Now.Month));//输出
Console.ReadLine();
}
}
公共静态类四分之一
{
公共静态字符串GetFirstMonth(整数月)
{

如果(月>=1&&month=4&&month=7&&month=10&&month=1&&month=4&&month=7&&month=10&&month编写一个包装类,根据当前日期时间给出第一个月或最后一个月,并根据当前区域性设置给出月份的名称

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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
Console.WriteLine(Quater.GetFirstMonth(DateTime.Now.Month));//输出十月
Console.WriteLine(Quater.getlastmount(DateTime.Now.Month));//输出
Console.ReadLine();
}
}
公共静态类四分之一
{
公共静态字符串GetFirstMonth(整数月)
{

如果(月>=1&&month=4&&month=7&&month=10&&month=1&&month=4&&month=7&&month=10&&month这些助手方法应该可以为您提供所需的一切:

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

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

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

您可以使用以下的季度类:


您可以使用以下的季度类:


看到了吗?举个奇迹的例子:)你是救命恩人,从我得到的其他答案来看,我出现了