如何在c#中找出一个四分之一和另一个四分之一之间有多少个四分之一

本文关键字:四分之一 一个 另一个 多少 之间 | 更新日期: 2023-09-27 17:52:13

我创建了一个名为Kwartal(翻译成Quarter)的类,用于我的程序:

    public sealed class Kwartal {
        private DateTime _poczatekKwartalu;
        private DateTime _koniecKwartalu;
        private int _numerKwartalu;
        private int _rok;
        public Kwartal(int numer, DateTime dataod, DateTime datado) {
            _numerKwartalu = numer;
            _koniecKwartalu = datado;
            _poczatekKwartalu = dataod;
            _rok = dataod.Year;
        }
        public Kwartal() { }
        public int Numer {
            get { return _numerKwartalu; }
            set { _numerKwartalu = value; }
        }
        public DateTime DataPoczatkowa {
            get { return _poczatekKwartalu; }
            set { _poczatekKwartalu = value; }
        }
        public DateTime DataKoncowa {
            get { return _koniecKwartalu; }
            set { _koniecKwartalu = value; }
        }
        public int Rok {
            get { return _rok; }
            set { _rok = value; }
        }
    }

这基本上就是Quarter的定义。通常我是这样定义的:

Kwartal kwartal1 = new Kwartal(1, new DateTime(year, 1, 1), new DateTime(year, 3, 31));
Kwartal kwartal2 = new Kwartal(2, new DateTime(year, 4, 1), new DateTime(year, 6, 30));

现在我想知道如何在这些上做数学。例如,我有2011年的季度1,然后是2012年的季度3。我想知道在Quarter1和之间有多少个quarterQuarter3。

Like kwartal2 - kwartal1 = 5

如何在c#中找出一个四分之一和另一个四分之一之间有多少个四分之一

没有任何地方可以定义一年中季度的数量-没有在Kwartal对象上设置一些属性/常量,您如何知道减法操作的基本值应该是什么?

一旦你设置了这个基础值,操作就会相当容易,你可以创建一个绝对的四分之一计数,例如

k.QuarterCount = (k1.year * kwartal.base) + k1.quarter

,那么从另一个年份中减去一个整数。

从你的回答,这是我要做的:

public static int zwrocRozniceMiedzyKwartalami(Kwartal kwartal1, Kwartal kwartal2) {
    var quartersPerYear = 4;
    var yearDifference = kwartal2.Rok - kwartal1.Rok;
    var differenceQuarters = (yearDifference * quartersPerYear) + (kwartal2.Numer - kwartal1.Numer);
    return differenceQuarters;
}

我想这会给你以下答案:

(year, Quarter1) - (year, Quarter2) =差值

(2012年,2)——(2011 1)=(2011 - 2012)* 4 +(1 - 2)= 4 + 5(1)= =>(2011年,1)前5个季度(2012 2)

(2014,1) -(2018 3) =(2018 - 2014) * 4 +(3 - 1) = 16 + 2 = 18 =>(2018年,3)是18个月后(2014年,1)

您可以使用。net的时间周期库的DateDiff类,尊重日历文化:

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  Console.WriteLine( "Date1: {0}", date1 );
  // > Date1: 08.11.2009 07:13:59
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  Console.WriteLine( "Date2: {0}", date2 );
  // > Date2: 20.03.2011 19:55:28
  DateDiff dateDiff = new DateDiff( date1, date2 );
  Console.WriteLine( "DateDiff.Quarters: {0}", dateDiff.Quarters );
  // > DateDiff.Quarters: 5
} // DateDiffSample

首先,应该定义计算结果应该是什么。创建一个包含一些数据和许多边缘情况的矩阵/表,并手动计算结果。

然后,你可以想出一个算法来计算它。基本实现这个算法。并测试你自己编的数据

哦,然后你开始考虑时区,夏令时等。你应该看看Jon Skeet的这篇博文

我不确定这是否是你想要达到的目标

DateTime quarter1 = new DateTime(2010, 3, 31); //end date of Q1 as you capture DataKoncowa 
DateTime quarter2 = new DateTime(2011, 3, 31);//end date of Q2 as you capture DataKoncowa 
TimeSpan ts = quarter2 - quarter1; //kwartal2.DataKoncowa  - kwartal1.DataKoncowa
int actualQuarters = ts.Days / (30 *3); //assuming quarter is 90 days

返回4 ..就像你期望的那样

如果将年份/季度转换为十进制,并做一点数学运算,就可以计算出差值。

class DateTimeQuarter
{
    public DateTimeQuarter(DateTime date)
    {
        Date = date;
        Quarter = date.Month / 4 + 1;
    }
    public static int operator -(DateTimeQuarter lhs, DateTimeQuarter rhs)
    {
        double value = Convert.ToDouble(
            (rhs.Date.Year - lhs.Date.Year)) + (rhs.Quarter / 10.0) - (rhs.Quarter / 10.0);
        int result = 
            (Convert.ToInt32(value) * 4) + Convert.ToInt32(value - Math.Floor(value));
        return result;
    }
    public DateTime Date { get; set; }
    public int Quarter { get; set; }
}
static void Main(string[] args)
{
    DateTimeQuarter q1 = new DateTimeQuarter(new DateTime(2006, 04, 20));
    DateTimeQuarter q2 = new DateTimeQuarter(new DateTime(2007, 12, 25));
    int quarters = q1 - q2;
}

我就是这样做的。看起来还行。如果你有更好的方法,请告诉我:-)

    public static int zwrocRozniceMiedzyKwartalami(Kwartal kwartal1, Kwartal kwartal2) {
        int quartersPerYear = 4;
        int differenceQuarters;
        int yearDifference = kwartal2.Rok - kwartal1.Rok;
        if (yearDifference == 0) {
            differenceQuarters = kwartal2.Numer - kwartal1.Numer;
            return differenceQuarters;
        } else if (yearDifference > 0) {
            differenceQuarters = (yearDifference * quartersPerYear) +  (kwartal2.Numer - kwartal1.Numer);
            return differenceQuarters;
        } else if (yearDifference < 0) {
            return -1;
        }
        return -1;  
    }