从给定日期计算季度的开始日期和名称

50

如何从给定日期中找到季度的开始日期和名称(1、2、3等)?

10个回答

131

类似这样(未经测试):

DateTime date;
int quarterNumber = (date.Month-1)/3+1;
DateTime firstDayOfQuarter = new DateTime(date.Year, (quarterNumber-1)*3+1,1);
DateTime lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1);

2
@roosteronacid: (quarterNumber-1)*3+1 将给出所给季度第一个月的月份。该代码创建了一个 DateTime 对象,表示该年该月的第一天。这是该季度的第一天。然后它再加上三个月。那将是下一个季度的第一天,所以所需季度的最后一天将是前一天(.AddDays(-1) 完成此操作)。 - Fredrik Mörk
请参考@il_guru在此处的答案=> https://dev59.com/q2gu5IYBdhLWcg3wrY0l - mynkow
3
是的,它是将数字乘以三再加一,而不是乘以四。换句话说,与((date.Month-1)/3) + 1((quarter-1)*3) + 1等效。 - Joe
1
代码中有一个错误。如果日期是2017年01月01日,你将会得到错误的季度第一天的年份。正确应该是2017年10月1日。获取季度第一天的正确方法为:var firstDayOfQuarter = new DateTime(date.AddMonths(-3).Year, (quarterNumber-1)*3+1,1); - Dmitrii Polianskii
@DmitriyPolyanskiy,Joe的计算是正确的形式,我已经使用了此标准形式的代码库推导。请确保遵循(1)构造函数参数顺序和(2)括号...虽然我会将每个计算块都包装起来,而不是依赖PEMDAS应用规则。 - GoldBishop
显示剩余2条评论

7
int GetQuarterName(DateTime myDate)
{
    return (int)Math.Ceiling(myDate.Month / 3.0);
}

DateTime GetQuarterStartingDate(DateTime myDate)
{
    return new DateTime(myDate.Year,(3*GetQuarterName(myDate))-2,1);
}

GetQuarterName函数获取当前月份数字除以3的“下一个”整数值。

GetQuarterStartingDate函数使用GetQuarterName的输出来计算月份值、原始日期的年份部分和表示该月第一天的1,以返回季度的开始日期。

(很抱歉我表达不清楚,我得了流感。:( )


4

2
        var date = new DateTime(2015, 3, 15);

        var quarter = (date.Month + 2) / 3;

        var quarterStartMonth = 3 * quarter - 2;

        var quarterStartDate = new DateTime(date.Year, quarterStartMonth, 1);

2
我认为这个解决方案非常可行。虽然需要更多的代码行数,但非常详细!
private DateTime GetFirstDayOfYearlyQuarter(DateTime value)
{
    switch (value.Month)
    {
        case 1:
        case 2:
        case 3:
            return new DateTime(value.Year, 1, 1);
        case 4:
        case 5:
        case 6:
            return new DateTime(value.Year, 4, 1);
        case 7:
        case 8:
        case 9:
            return new DateTime(value.Year, 7, 1);
        case 10:
        case 11:
        case 12:
            return new DateTime(value.Year, 10, 1);
        default:
            throw new Exception(@"¯\_(ツ)_/¯");
    }
}

注:这只能找到季度的第一天,但您可以轻松扩展此功能以查找季度号等。

"Original Answer"翻译成中文是"最初的回答"。


1
DateTime date;
int quarterNumber = (date.Month-1)/3+1;
DateTime firstDayOfQuarter = new DateTime(date.Year, (quarterNumber-1)*3+1,1);
DateTime lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1);

2
欢迎来到 Stack Overflow。没有任何解释的代码转储通常不是很有帮助。Stack Overflow 关注的是学习,而不是提供可盲目复制粘贴的代码段。请[编辑]您的问题,并解释它比原始帖子提供的更好。请参见 [答案]。 - Chris

0
一个更简单的两行代码,带有实时演示在这里 + 按下F8运行。
var date = DateTime.Now; //Give you own DateTime
int offset = 2, monthsInQtr = 3;

var quarter = (date.Month + offset) / monthsInQtr; //To find which quarter 
var totalMonths = quarter * monthsInQtr;

var startDateInQtr = new DateTime(date.Year, totalMonths - offset, 1); //start date in quarter 

如果你想要获取季度的最后一天,可以使用DateTime.DaysInMonth
var endDateInQtr = new DateTime(date.Year, totalMonths, DateTime.DaysInMonth(date.Year, totalMonths));

0

让我们从季度的开始日期开始。我认为这个更有用,而且更难找到一个整洁的实现方法。

  • 年份:输入的年份。
  • 月份:输入的月份,减去它超过季度第一个月的天数(例如,二月超过季度的第一个月(一月)1天)。
  • 日:1
public static DateOnly GetFirstDayOfCurrentQuarter(DateTime dateTime)
{
    var month = dateTime.Month - (dateTime.Month - 1) % 3;
    var result = new DateOnly(dateTime.Year, month, 1);

    return result;
}

通过将当前月份设为从0开始计数(dateTime.Month - 1),我们可以轻松地看到它超出季度开始的时间(% 3)多少。我们从当前月份中减去超出的部分,就可以得到该季度的起始月份。
季度编号(1-4)更加简单:
var quarterNumber = (dateTime.Month - 1) / 3 + 1;

通过将当前月份设为从0开始计数(dateTime.Month - 1),我们可以轻松地获得基于0的季度索引/ 3。然后我们将其转换为季度数字+ 1)。


0
    public static class DateTimeExtensions
{
    public static DateTime StartOfQuarter(this DateTime _date)
    {
        var quarter = decimal.ToInt16(Math.Ceiling(_date.Month / 3.0m));
        return new DateTime(_date.Year, quarter, 1);
    }
}

使用

var quarterStart = DateTime.Today.StartOfQuarter();

0

这里有三个方法。一个是获取当前季度号,另外两个是获取开始日期和结束日期。

static (DateTime startDate, DateTime endDate) GetCurrentQuarter(DateTime date)
{
    var year = date.Year;
    var quarter = (int)Math.Ceiling(date.Month / 3d);
    var start = GetStartDateOfQuarter(year, quarter);
    var end = GetEndDateOfQuarter(year, quarter);
    return (start, end);
}

static DateTime GetStartDateOfQuarter(int year, int quarter)
{
    var month = quarter * 3 - 2;
    return new DateTime(year, month, 1);
}

static DateTime GetEndDateOfQuarter(int year, int quarter)
{
    var month = quarter * 3;
    var daysInMonth = DateTime.DaysInMonth(year, month);
    return new DateTime(year, month, daysInMonth);
}

然后进行测试目的:

var date = new DateTime(2023, 1, 1); // 2023-01-01

var (start, end) = GetCurrentQuarter(date);

Console.WriteLine("Start date of Current Quarter: {0}", start);
Console.WriteLine("End date of Current Quarter: {0}", end);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接