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

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

var maxDay = dtpAttendance.MaxDate.Day;

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

DateTime dt = DateTime.today;

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


当前回答

你可以做到的

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

其他回答

很简单

Begin = new DateTime(DateTime.Now.Year, DateTime.Now.Month,1).ToShortDateString();
End = new DataFim.Text = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month)).ToShortDateString();

试试这个:

string strDate = DateTime.Now.ToString("MM/01/yyyy");

我们需要能够获得给定日期月的开始和结束,包括时间,包括时间。我们最终使用了前面提到的解决方案,非常感谢这里的每个人,并将其组合到一个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结构只存储一个值,而不是一个值范围。MinValue和MaxValue是静态字段,用于保存DateTime结构实例的可能值范围。这些字段是静态的,与DateTime的特定实例无关。它们与DateTime类型本身相关。

推荐阅读:static (c#参考)

更新:获取月份范围:

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

更新:来自评论(@KarlGjertsen & @SergeyBerezovskiy)

DateTime date = ...
var firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddSeconds(-1);
//OR
var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddTicks(-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));