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

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

var maxDay = dtpAttendance.MaxDate.Day;

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

DateTime dt = DateTime.today;

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


当前回答

DateTime dCalcDate = DateTime.Now;
var startDate = new DateTime(Convert.ToInt32(Year), Convert.ToInt32(Month), 1);
var endDate = new DateTime(Convert.ToInt32(Year), Convert.ToInt32(Month), DateTime.DaysInMonth((Convert.ToInt32(Year)), Convert.ToInt32(Month)));

其他回答

你可以试着得到本月的第一天;

DateTime.Now.AddDays(-(DateTime.Now.Day-1))

给它赋一个值。

是这样的:

dateEndEdit.EditValue = DateTime.Now;
dateStartEdit.EditValue = DateTime.Now.AddDays(-(DateTime.Now.Day-1));

你可以做到的

DateTime dt = DateTime.Now; 
DateTime firstDayOfMonth = new DateTime(dt.Year, date.Month, 1);
DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);

试试吧。它主要计算DateTime上已经过的天数。然后减去1,并使用新值找到当前月份的第一天。从那里,它使用DateTime并使用. addmonths(-1)来获取前一个月的第一天。

获取上个月的最后一天基本上做的是同样的事情,只不过它给当月的天数加了1,然后从DateTime.Now中减去这个值。AddDays,给你上个月的最后一天。

int NumberofDays = DateTime.Now.Day;
int FirstDay = NumberofDays - 1;
int LastDay = NumberofDays + 1;
DateTime FirstofThisMonth = DateTime.Now.AddDays(-FirstDay);
DateTime LastDayOfLastMonth = DateTime.Now.AddDays(-LastDay);
DateTime CheckLastMonth = FirstofThisMonth.AddMonths(-1);

我们需要能够获得给定日期月的开始和结束,包括时间,包括时间。我们最终使用了前面提到的解决方案,非常感谢这里的每个人,并将其组合到一个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实例的Kind。例如,如果您的原始DateTime实例是UTC Kind,那么通过创建一个新的DateTime实例,您将创建一个Unknown Kind实例,然后根据服务器设置将其视为本地时间。因此,获取每月第一个和最后一个日期的更正确的方法是:

var now = DateTime.UtcNow;
var first = now.Date.AddDays(-(now.Date.Day - 1));
var last = first.AddMonths(1).AddTicks(-1);

这样就保留了DateTime实例的原始Kind。