提问人:Rod 提问时间:7/29/2010 最后编辑:idbriiRod 更新时间:6/19/2021 访问量:48449
DateTime.Now - 一天中的第一分钟和最后一分钟
DateTime.Now - first and last minutes of the day
问:
有没有简单的方法可以得到 的 “” 和 “”?DateTime
TimeMin
TimeMax
TimeMin
:一天中的第一刻。在此之前没有发生,并且仍然在同一天发生。DateTime
TimeMax
:一天中的最后一刻。在此之后没有发生,并且仍然在同一天发生。DateTime
这些值有助于筛选和执行与日期相关的查询。
答:
以下是我用来做到这一点的两个扩展。
/// <summary>
/// Gets the 12:00:00 instance of a DateTime
/// </summary>
public static DateTime AbsoluteStart(this DateTime dateTime)
{
return dateTime.Date;
}
/// <summary>
/// Gets the 11:59:59 instance of a DateTime
/// </summary>
public static DateTime AbsoluteEnd(this DateTime dateTime)
{
return AbsoluteStart(dateTime).AddDays(1).AddTicks(-1);
}
这允许您编写:
DateTime.Now.AbsoluteEnd() || DateTime.Now.AbsoluteStart()
或
DateTime partyTime = new DateTime(1999, 12, 31);
Console.WriteLine("Start := " + partyTime.AbsoluteStart().ToString());
Console.WriteLine("End := " + partyTime.AbsoluteEnd().ToString());
评论
DateTime.Now.AbsoluteStart()
是多余的,因为它与 相同。 是“设置为今天日期的对象,时间部分设置为 00:00:00。DateTime.Today
DateTime.Today
尝试
//midnight this morning
DateTime timeMin = DateTime.Now.Date;
//one tick before midnight tonight
DateTime timeMax = DateTime.Now.Date.AddDays(1).AddTicks(-1)
如果您将其用于筛选,正如您的评论所建议的那样,最好将 DateTime.Now 保存到变量中,以防日期在两次调用之间滴答作响。不太可能,但称它为足够多的次数,它将不可避免地在某一天(而不是晚上)发生。
DateTime currentDateTime = DateTime.Now;
DateTime timeMin = currentDateTime.Date;
DateTime timeMax = currentDateTime.Date.AddDays(1).AddTicks(-1)
评论
我会使用以下内容:
DateTime now = DateTime.Now;
DateTime startOfDay = now.Date;
DateTime endOfDay = startOfDay.AddDays(1);
并使用 代替 .这意味着无论精度是分钟、秒、毫秒、刻度还是其他值,它都会起作用。这将防止像我们在 StackOverflow 上遇到的错误(尽管建议被忽略了)。< endOfDay
<= endOfDay
请注意,如果您想要同一天的开始和结束,请务必只拨打一次电话。DateTime.Now
评论
像其他回答者一样,我不太确定你在问什么,但如果你想要尽可能短的时间和尽可能长的时间,(不仅仅是一天),那么就有和返回 1/1/0001 12:00:00 AM
和 12/31/9999 晚上 11:59:59。DateTime.MinValue
DateTime.MaxValue
我建议你看看这个答案:如何使用 DateTime 指定一天中最晚的时间
如果原始 DateTimes 还可能包含时间,则使用 AddDays() 方法将添加整整 24 小时,这可能不是您想要的。
public static DateTime ToEndOfDay(this DateTime time)
{
var endOfDaySpan = TimeSpan.FromDays(1).Subtract(TimeSpan.FromMilliseconds(1));
return time.Date.Add(endOfDaySpan);
}
对上面的猎人解决方案进行一个小调整...... 我使用以下扩展方法来获取一天的结束:
public static DateTime EndOfDay(this DateTime input) {
return input.Date == DateTime.MinValue.Date ? input.Date.AddDays(1).AddTicks(-1) : input.Date.AddTicks(-1).AddDays(1);
}
这应该会处理 DateTime 为 或 的情况。如果在 DateTime.MaxValue 上调用 AddDays(1),则会出现异常。同样,调用 AddTicks(-1) 也会引发异常。DateTime.MinValue
DateTime.MaxValue
DateTime.MinValue
请注意,如果要将此时间传递给 sql server,则应使用
dateTime.Date.AddDays(1).AddMilliseconds(-3);
看:
使用时一定要小心
(new DateTime()).AddDays(1).AddTicks(-1);
当它被传递给存储过程时。
该值可能会近似到第二天。
DateTime.Today.AddDays(1).AddSeconds(-1);
不是很准确,但解决了我的问题。现在我们可以使用 AddMilliseconds、AddTicks 等。我认为它只会因满足您的需求而有所不同。
上一个:窗口是否存在焦点的浏览器事件?
下一个:迭代文件夹和子文件夹的最佳方式
评论