确定当季度基于随机开始日期时日期落入的季度

时间:2016-04-08 20:20:09

标签: c# date datetime

假设我的合约的开始和结束日期为2016年1月2日至2017年1月31日

季度是根据合约的开始日期确定的,所以它与使用普通的日历季度不同。

Q1:FEB MAR APR
Q2:MAY JUN JUL
Q3:8月10日9月 Q4:1月12日

使用正常的日历季度,我可以做到:(date.Month + 2) / 3;

在这种情况下我该怎么做?

3 个答案:

答案 0 :(得分:1)

像这样更通用的东西?

var quarter = (((checkDate.Year * 12 + checkDate.Month - 1) - (startDate.Year * 12 + startDate.Month - 1)) / 3) % 4 + 1;

这是一种将当前日期考虑在内的方法:

using System;

namespace ConsoleApplication1
{
    class Contract
    {
        public DateTime StartDate { get; set; }

        public int CurrentQuarter
        {
            get
            {
                var now = DateTime.Now.Date;
                var month = (now.Year*12 + now.Month - 1) - (StartDate.Year*12 + StartDate.Month - 1);
                if (now.Day < StartDate.Day) month--;
                var quarter = (month / 3) + 1;
                return quarter;
            }
        }
        // ...
    }

    class Program
    {
        static void Main()
        {
            var contract = new Contract { StartDate = new DateTime(2016, 1, 12) };
            Console.WriteLine("Current contract quarter is {0}", contract.CurrentQuarter);
        }
    }
}

答案 1 :(得分:1)

您可以使用与以前相同的逻辑,只需先减去合约的起始月份。当然,您还需要考虑明年的日期。如果你只减去月份,那么这些将永远是负数,所以你可以使用支票来判断它是明年,并进行补偿。所以,对于你给出的例子:

var startMonth = 2;
var date = DateTime.Now; //Or whatever date to check
var monthDiff = date.Month - startMonth;
if (monthDiff < 0)
{
    monthDiff += 12;
}
var quarter = (monthDiff + 3) / 3;

答案 2 :(得分:0)

尝试以下方法:

((date.Month + 10) / 3)  % 4;