鉴于DateTime
对象,我想知道它的相应季度中的哪一天。
E.g。 2 Feb
是第一季度的33
日。
我可以从这个月开始这个季度:
(int)System.Math.Ceiling(month / (double)3)
我还可以使用DateTime.DaysInMonth()
查看每个季度的天数。
我写了这个特别难看的方法,希望有人能指出我(显而易见的事情)我确信我不知道。
public static int DayOfQuarter(DateTime dt)
{
var quarter = GetQuarter(dt);
int[] months = new int[0];
switch (quarter)
{
case 1:
months = new[] { 1, 2, 3 };
break;
case 2:
months = new[] { 4, 5, 6 };
break;
case 3:
months = new[] { 7, 8, 9 };
break;
case 4:
months = new[] { 10, 11, 12 };
break;
}
var idx = -1;
for (var i = 0; i < months.Length; i++)
{
if (months[i] == dt.Month)
{
idx = i;
}
}
if (idx == 0)
{
return dt.Day;
}
if (idx == 1)
{
return DateTime.DaysInMonth(dt.Year, dt.Month - 1) + dt.Day;
}
return DateTime.DaysInMonth(dt.Year, dt.Month - 2) + DateTime.DaysInMonth(dt.Year, dt.Month - 1) + dt.Day;
}
答案 0 :(得分:4)
是的,我认为我们可以使用DayOfYear
属性使这更简单。您只需要能够计算出本季度的开始时间,然后您就可以从指定日期的某一天开始 日期的日期
public static int DayOfQuarter(DateTime dt)
{
int zeroBasedQuarter = (dt.Month - 1) / 3;
DateTime startOfQuarter = new DateTime(dt.Year, zeroBasedQuarter * 3 + 1, 1);
return dt.DayOfYear - startOfQuarter.DayOfYear + 1;
}
这是一个简短但完整的测试应用程序:
using System;
public class Program
{
static void Main()
{
var dates = new[]
{
new DateTime(2000, 1, 1),
new DateTime(2001, 1, 1),
new DateTime(2000, 3, 1),
new DateTime(2001, 3, 1),
new DateTime(2000, 4, 1),
new DateTime(2001, 4, 1),
new DateTime(2000, 5, 1),
new DateTime(2001, 5, 1),
new DateTime(2000, 12, 31),
new DateTime(2001, 12, 31),
};
foreach (var date in dates)
{
int dayOfQuarter = DayOfQuarter(date);
Console.WriteLine($"{date:yyyy-MM-dd}: {dayOfQuarter}");
}
}
public static int DayOfQuarter(DateTime dt)
{
int zeroBasedQuarter = (dt.Month - 1) / 3;
DateTime startOfQuarter = new DateTime(dt.Year, zeroBasedQuarter * 3 + 1, 1);
return dt.DayOfYear - startOfQuarter.DayOfYear + 1;
}
}
输出:
2000-01-01: 1
2001-01-01: 1
2000-03-01: 61
2001-03-01: 60
2000-04-01: 1
2001-04-01: 1
2000-05-01: 31
2001-05-01: 31
2000-12-31: 92
2001-12-31: 92
注意第三和第四行,表明它在闰年时做了正确的事情(3月1日的季度是闰年的一天)。
我还建议避免使用GetQuarter
方法的浮点数 - 这是不必要的:
public static int GetQuarter(DateTime dt) => (dt.Month - 1) / 3 + 1;