我想要得到给定日期所在月份的第一天和最后一天。日期来自UI字段中的值。

如果我使用时间选择器,我可以说

var maxDay = dtpAttendance.MaxDate.Day;

但我试图从DateTime对象中获取它。如果我有这个。

DateTime dt = DateTime.today;

如何从dt中获取每月的第一天和最后一天?


当前回答

“一个月的最后一天”实际上是“下个月的第一天,减1”。所以这是我使用的,不需要“DaysInMonth”方法:

public static DateTime FirstDayOfMonth(this DateTime value)
{
    return new DateTime(value.Year, value.Month, 1);
}

public static DateTime LastDayOfMonth(this DateTime value)
{
    return value.FirstDayOfMonth()
        .AddMonths(1)
        .AddMinutes(-1);
}

注意: 我在这里使用AddMinutes(-1)而不是AddDays(-1)的原因是,通常你需要这些日期函数来报告一些日期-期间,当你构建一个期间的报告时,“结束日期”实际上应该是类似于2015年10月31日23:59:59这样的东西,这样你的报告就可以正确地工作-包括当月最后一天的所有数据。

也就是说,你实际上是在“这个月的最后一刻”。不是最后一天。

好了,我要闭嘴了。

其他回答

我们需要能够获得给定日期月的开始和结束,包括时间,包括时间。我们最终使用了前面提到的解决方案,非常感谢这里的每个人,并将其组合到一个util类中,以便能够获得给定月份和年份的开始和结束,直到最后一毫秒。包括我们做了些什么,以帮助其他人。

util:

public class DateUtil
{
    public static (DateTime startOfMonth, DateTime endOfMonth) GetStartAndEndOfMonth(int month, int year)
    {
        DateTime startOfMonth = GetStartOfMonth(month, year);
        DateTime endOfMonth = GetEndOfMonth(month, year);

        return (startOfMonth, endOfMonth);
    }

    public static DateTime GetStartOfMonth(int month, int year)
    {
        return new DateTime(year, month, 1).Date;
    }

    public static DateTime GetEndOfMonth(int month, int year)
    {
        return new DateTime(year, month, 1).Date.AddMonths(1).AddMilliseconds(-1);
    }
}

用法:

(DateTime startOfMonth, DateTime endOfMonth) = DateUtil.GetStartAndEndOfMonth(2, 2021); // February, 2021
DateTime dCalcDate = DateTime.Now;
dtpFromEffDate.Value = new DateTime(dCalcDate.Year, dCalcDate.Month, 1);
dptToEffDate.Value = new DateTime(dCalcDate.Year, dCalcDate.Month, DateTime.DaysInMonth(dCalcDate.Year, dCalcDate.Month));

在这里,您可以为当前月份的第一天添加一个月,而不是从那天开始删除一天。

DateTime now = DateTime.Now;
var startDate = new DateTime(now.Year, now.Month, 1);
var endDate = startDate.AddMonths(1).AddDays(-1);

创建一个DateTime类的实例

DateTime dateTime = DateTime.Now;

如果你想要得到这个月的最后一天,你可以这样做

int lastDayOfMonth = DateTime.DaysInMonth(caducidadPuntos.Year, caducidadPuntos.Month);

如果你想得到每月的第一天,你可以这样做

DateTime firstDayMonth = new DateTime(dateTime.Year, dateTime.Month, 1);

使用.Net API获取月份范围(只是另一种方式):

DateTime date = ...
var firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
var lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));