我创建了一个名为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
没有任何地方可以定义一年中季度的数量-没有在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;
}