【问题标题】:Count of quarter between dates日期之间的季度计数
【发布时间】:2011-07-06 06:53:06
【问题描述】:

我想计算给定时间跨度内(一年)的总季度数。

例如:

start date = 1-june -2009
end date = 18-july-2011

count should be = 10.

one more 
start date = 4-Jan-2009 
end date = 27-oct -2010
count =8.

我无法得到正确的结果。

【问题讨论】:

  • 你的算法是什么?从您提供的日期或从日期的月份开始,就像 1 quater = 3 个月......
  • 也许这是一个愚蠢的问题......但究竟什么是四分之一?
  • jan - mar = 1 个季度,如果单月也在那里,我必须将其视为 1 个季度,前开始日期 = 2009 年 1 月 4 日结束日期 = 2010 年 10 月 27 日计数 =8 .如何达到 8 jan09- mar09 =1,apr09-jun09 1,july09-sep09 1,oct09-dec09 1,比 jan10-mar10 1,apr10-jun10 1,july10-sep10 1,oct10 是 1,所以总共 8。跨度>
  • @ankur - 试试我粘贴的代码
  • 你确定你的假设2010-01-012010-01-01之间的季度数应该是1而不是0??

标签: c# asp.net datetime


【解决方案1】:

你的例子是错误的:4-Jan-200927-oct -2010 之间只有 7 个季度

您可以简单地将Microsoft.VisualBasic.dll 的引用添加到您的项目中并使用DateDiff

VB:

Public Shared Function getQuartersBetween(ByVal d1 As Date, ByVal d2 As Date) As Int32
    Return DateDiff(DateInterval.Quarter, d1, d2)
End Function

C#:

public static int getQuartersBetween(System.DateTime d1, System.DateTime d2)
{
    return Microsoft.VisualBasic.DateAndTime.DateDiff(DateInterval.Quarter, d1, d2);
}

或者您可以编写自己的实现:

public class Quarter
{

    public static long GetQuarters(DateTime dt1, DateTime dt2) 
    { 
        double d1Quarter = GetQuarter(dt1.Month); 
        double d2Quarter = GetQuarter(dt2.Month); 
        double d1 = d2Quarter - d1Quarter; 
        double d2 = (4 * (dt2.Year - dt1.Year)); 
        return Round(d1 + d2); 
    } 

    private static int GetQuarter(int nMonth) 
    { 
        if (nMonth <= 3) 
            return 1; 
        if (nMonth <= 6) 
            return 2; 
        if (nMonth <= 9) 
            return 3; 
        return 4; 
    } 

    private static long Round(double dVal) 
    { 
        if (dVal >= 0) 
              return (long)Math.Floor(dVal); 
        return (long)Math.Ceiling(dVal); 
    } 
}

或在 VB.NET 中:

Public Class Quarter

    Public Shared Function GetQuarters(ByVal dt1 As DateTime, ByVal dt2 As DateTime) As Long
        Dim d1Quarter As Double = GetQuarter(dt1.Month)
        Dim d2Quarter As Double = GetQuarter(dt2.Month)
        Dim d1 As Double = d2Quarter - d1Quarter
        Dim d2 As Double = (4 * (dt2.Year - dt1.Year))
        Return Round(d1 + d2)
    End Function

    Private Shared Function GetQuarter(ByVal nMonth As Integer) As Integer
        If nMonth <= 3 Then
            Return 1
        End If
        If nMonth <= 6 Then
            Return 2
        End If
        If nMonth <= 9 Then
            Return 3
        End If
        Return 4
    End Function

    Private Shared Function Round(ByVal dVal As Double) As Long
        If dVal >= 0 Then
            Return CLng(Math.Floor(dVal))
        End If
        Return CLng(Math.Ceiling(dVal))
    End Function

End Class

【讨论】:

  • 好吧 ..27 Oct 位于第四季度 .. 所以它是 8
  • 但在2010-01-012010-01-31 之间是0 个季度而不是1,因此从第一个到第四个是三个季度+ 4 = 7 个季度。
  • 不是我的电话..我的假设来自 OP 提供的数据,只有他可以为他澄清2010-01-012010-01-31 应该是 1
  • @V4Vendetta:好的,如果他需要这种不寻常的方法,他可以在我的函数结果中加 1。
【解决方案2】:

给你的代码:试试下面的代码

 public static void Main()
    {
        //Application.Run(new XmlTreeDisplay());
        int monthdiuff = monthDifference(Convert.ToDateTime("01/04/09"), Convert.ToDateTime("10/27/10"));
        Console.WriteLine(monthdiuff);
        int totalQuater = (monthdiuff / 3) + (monthdiuff%3);
        Console.WriteLine(totalQuater);
        Console.ReadLine();
    }

    private static int monthDifference(DateTime startDate, DateTime endDate)
    {
        int monthsApart = 12 * (startDate.Year - endDate.Year) + startDate.Month - endDate.Month;
        return Math.Abs(monthsApart);
    }

【讨论】:

  • 在同一个示例中,总季度应该是 8,但实际上是 7,我也在使用类似的代码,但在某些情况下会出错
【解决方案3】:

如果没有一些代码可以查看,我无法帮助您找到您的确切问题。

如果是我,我可能会发现日期之间的差异,然后除以一个季度的天数(91 左右)。我确信 C# 有某种日期解析模块,可以将日期作为字符串读取,为您提供两个对象,然后您可以减去它们以找出天数的差异。

【讨论】:

    【解决方案4】:

    这是根据您的假设计算季度的一种粗略形式,您可以选择修改它,因为它足够好

    DateTime dt1 = new DateTime(2009, 1, 1);// new DateTime(2009, 6, 1);
    DateTime dt2 = new DateTime(2010, 10, 27);// new DateTime(2011, 7, 18);
    if (dt1.Month < 4)
      dt1 = new DateTime(dt1.Year,1,1);
    else if (dt1.Month < 7)
      dt1 = new DateTime(dt1.Year,4,1);
    else if (dt1.Month < 10)
      dt1 = new DateTime(dt1.Year,7,1);
    else
      dt1 = new DateTime(dt1.Year,10,1);
    if (dt2.Month < 4)
       dt2 = new DateTime(dt2.Year, 3, DateTime.DaysInMonth(dt2.Year, 3)); 
    else if (dt2.Month < 7)
       dt2 = new DateTime(dt2.Year, 6, DateTime.DaysInMonth(dt2.Year, 6));
    else if (dt2.Month < 10)
       dt2 = new DateTime(dt2.Year, 9, DateTime.DaysInMonth(dt2.Year, 9));
    else
       dt2 = new DateTime(dt2.Year, 12, DateTime.DaysInMonth(dt2.Year, 12));
    
    TimeSpan ts = dt2 - dt1;
    int quarters = (int) ts.TotalDays/90;
    Console.WriteLine(quarters);
    

    我根据您的需要将日期设置为季度的开始和结束,然后假设 90 天的季度将 diff 转换为 int。适用于您提到的示例,看看它是否适合您

    【讨论】:

      【解决方案5】:

      如果一个季度的定义是相差 90 天,那当然很简单:

          internal static int GetNumberOfQuarters(DateTime p_DtStart, DateTime p_DtEnd)
          {
              TimeSpan span = p_DtEnd.Subtract(p_DtStart);
              return (int)span.TotalDays % 90;
          }
      

      但这不是你要找的。这个怎么样(未经测试,但你会明白的)

      internal static class DateTimeTools
      {
          internal static int GetNumberOfQuartersBetweenDates(DateTime startDate, DateTime endDate)
          {
              int iYearStart, iYearEnd, iMonthStart, iMonthEnd, iDayStart, iDayEnd;
              iYearStart = startDate.Year;
              iYearEnd = endDate.Year;
              iMonthStart = startDate.Month;
              iMonthEnd = endDate.Month;
              iDayStart = startDate.Day;
              iDayEnd = endDate.Day;
      
              int iYearDiff, iQuarterDiff, iDayDiff;
              iYearDiff = iYearEnd - iYearStart;
              iQuarterDiff = iMonthEnd % 3 - iMonthStart % 3;
              iDayDiff = iDayEnd - iDayStart;
      
              int iNumOfQuarters = 0;
      
              // at least a year difference? 
              if ((iYearDiff > 0 && iQuarterDiff > 0) || iYearDiff > 0 && iQuarterDiff == 0 && iDayDiff >= 0)
              {
                  iNumOfQuarters = iYearDiff * 4 + iQuarterDiff;
              }
              // at least a quarter difference?
              // within different years
              if ((iYearDiff > 0 && iQuarterDiff <= 0)) // eg, dec 2010 - feb 2011 iYearDiff 1 iQuarterDiff -3
              {
                  if ((iQuarterDiff == -3 && iDayDiff >= 0) || iQuarterDiff > -3)
                  {
                      iNumOfQuarters = iQuarterDiff + 4;
                  }
              }
              // within the same year
              if (iYearDiff == 0 && iQuarterDiff > 0)
              {
                  if ((iQuarterDiff == 1 && iDayDiff >= 0) || iQuarterDiff > 1)
                  {
                      iNumOfQuarters = iQuarterDiff;
                  }
              }
              return iNumOfQuarters;
          }
      }
      

      问候, 妮可

      【讨论】:

        【解决方案6】:
        public static string GetQuarter(this DateTime date)
                {
                    var quarterList = new List<string>();
        
                    if (date.Month >= 1 && date.Month <= 3)
                        return "Q1";
                    else if (date.Month >= 4 && date.Month <= 6)
                        return "Q1,Q2";
                    else if (date.Month >= 7 && date.Month <= 9)
                        return "Q1,Q2,Q3";
                    else
                        return "Q1,Q2,Q3,Q4";
                }
        

        如果您希望获得季度列表,这也可以用作扩展方法,您可以稍后使用GetQuarter().Split(new[] { ',' }).Count() 来获取计数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-06
          • 2018-12-28
          相关资源
          最近更新 更多