C# 当季度基于随机开始日期时,确定日期所在的季度

C# 当季度基于随机开始日期时,确定日期所在的季度,c#,date,datetime,C#,Date,Datetime,假设我有一份合同,合同的开始和结束日期为2016年1月2日至2017年1月31日 季度是根据合同的开始日期确定的,因此与仅使用普通日历季度不同 第一季度:2月至3月至4月 问题2:5-6-7月 第三季度:8月至10月至9月 第四季度:11月至12月至1月 对于正常的日历季度,我可以简单地执行:(date.Month+2)/3 在这种情况下我该怎么做?像这样更一般的事情 var quarter = (((checkDate.Year * 12 + checkDate.Month - 1) - (s

假设我有一份合同,合同的开始和结束日期为2016年1月2日至2017年1月31日

季度是根据合同的开始日期确定的,因此与仅使用普通日历季度不同

第一季度:2月至3月至4月
问题2:5-6-7月
第三季度:8月至10月至9月
第四季度:11月至12月至1月

对于正常的日历季度,我可以简单地执行:
(date.Month+2)/3


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

像这样更一般的事情

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
{
班级合同
{
公共日期时间起始日期{get;set;}
公共国际季度
{
得到
{
var now=DateTime.now.Date;
变量月=(现在.年*12+现在.月-1)-(开始日期.年*12+开始日期.月-1);
如果(now.Day
像这样更一般的东西

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
{
班级合同
{
公共日期时间起始日期{get;set;}
公共国际季度
{
得到
{
var now=DateTime.now.Date;
变量月=(现在.年*12+现在.月-1)-(开始日期.年*12+开始日期.月-1);
如果(now.Day
您可以使用与以前相同的逻辑,只需先减去合同的起始月份。当然,你还需要考虑下一年的日期。如果你只是减去月份,这些都是负数,所以你可以用负数来表示是下一年,并进行补偿。因此,对于您给出的示例:

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;
var startMonth=2;
var date=DateTime.Now//或是任何需要检查的日期
var monthDiff=日期月份-开始月份;
if(monthDiff<0)
{
monthDiff+=12;
}
var季度=(月利率+3)/3;

您可以使用与以前相同的逻辑,只需先减去合同的起始月份。当然,你还需要考虑下一年的日期。如果你只是减去月份,这些都是负数,所以你可以用负数来表示是下一年,并进行补偿。因此,对于您给出的示例:

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;
var startMonth=2;
var date=DateTime.Now//或是任何需要检查的日期
var monthDiff=日期月份-开始月份;
if(monthDiff<0)
{
monthDiff+=12;
}
var季度=(月利率+3)/3;
尝试以下操作:

((date.Month + 10) / 3)  % 4;
请尝试以下操作:

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

这应该是“到2017年1月31日”吗?这应该是“到2017年1月31日”吗?显然,这只有在合同期限为一年或更短的情况下才有效。如果它需要处理更长的合同,则需要对代码进行增强,以查看开始日期和“检查”日期。显然,只有在合同期限为一年或更短的情况下,这才有效。如果它需要处理更长的合同,则需要对代码进行增强,以查看开始日期和“检查”日期的年份。这似乎是最清晰的答案,但如果没有合同开始日期作为参数,我看不出它如何工作。我创建的这个新助手函数将有两个参数:一个是合同开始日期,另一个是你想知道它属于哪个季度的日期。这似乎是最清晰的答案,但我不知道如果没有合同开始日期作为参数,它怎么可能工作。我创建的这个新助手函数将有两个参数:一个是合同开始日期,另一个是你想知道它属于哪个季度的日期。这个解决方案看起来不错,但假设合同开始于2016年2月21日,那么Q1将包括:2/21到4/21。在这种情况下,如果检查日期为2016年4月22日,则应为第2季度,但您的函数返回为第1季度。我怎样才能把这一天算在内?告诉我在你的公式后面加上这个是否应该起作用:if checkDate.day>startDate.day?季度=季度+1:季度。“我还没能打破它。”布莱克里维尔:是的,我也想过。我认为你的思路是正确的,但看看我添加的第二种方法。这个解决方案似乎不错,但假设合同从2016年2月21日开始,那么第一季度将包括:2月21日到4月21日。在这种情况下,如果检查日期为2016年4月22日,则应为第2季度,但您的函数返回为第1季度。我怎样才能把这一天算在内?告诉我在你的公式后面加上这个是否应该起作用:if checkDate.day>startDate.day?季度=季度+1:季度。“我还没能打破它。”布莱克里维尔:是的,我也想过。我认为你的思路是对的,但看看我添加的第二种方法。