我想要得到给定日期所在月份的第一天和最后一天。日期来自UI字段中的值。
如果我使用时间选择器,我可以说
var maxDay = dtpAttendance.MaxDate.Day;
但我试图从DateTime对象中获取它。如果我有这个。
DateTime dt = DateTime.today;
如何从dt中获取每月的第一天和最后一天?
我想要得到给定日期所在月份的第一天和最后一天。日期来自UI字段中的值。
如果我使用时间选择器,我可以说
var maxDay = dtpAttendance.MaxDate.Day;
但我试图从DateTime对象中获取它。如果我有这个。
DateTime dt = DateTime.today;
如何从dt中获取每月的第一天和最后一天?
当前回答
这里接受的答案没有考虑到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。
其他回答
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);
“一个月的最后一天”实际上是“下个月的第一天,减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这样的东西,这样你的报告就可以正确地工作-包括当月最后一天的所有数据。
也就是说,你实际上是在“这个月的最后一刻”。不是最后一天。
好了,我要闭嘴了。
试试吧。它主要计算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);
我在我的脚本中使用了这个(适用于我),但我需要一个完整的日期,而不需要将其修剪为只有日期而没有时间。
public DateTime GetLastDayOfTheMonth()
{
int daysFromNow = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month) - (int)DateTime.Now.Day;
return DateTime.Now.AddDays(daysFromNow);
}
我们需要能够获得给定日期月的开始和结束,包括时间,包括时间。我们最终使用了前面提到的解决方案,非常感谢这里的每个人,并将其组合到一个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