有没有简单的方法来获取DateTime.Now
的“TimeMin
”和“TimeMax
”?
答案 0 :(得分:89)
以下是我用来做的两个扩展。
/// <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());
答案 1 :(得分:12)
我会使用以下内容:
DateTime now = DateTime.Now;
DateTime startOfDay = now.Date;
DateTime endOfDay = startOfDay.AddDays(1);
并使用< endOfDay
代替<= endOfDay
。这意味着无论精度是分钟,秒,毫秒,刻度还是其他,它都能工作。这样可以防止the one we had on StackOverflow之类的错误(虽然建议是ignored)。
请注意,如果您想要同一天的开始和结束,只需拨打DateTime.Now
一次就很重要。
答案 2 :(得分:10)
试
//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)
答案 3 :(得分:2)
上面对猎人解决方案的一个小调整...... 我使用以下扩展方法来结束一天:
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.MinValue
或DateTime.MaxValue
的情况。如果在DateTime.MaxValue上调用AddDays(1),则会出现异常。同样,在DateTime.MinValue
上调用AddTicks(-1)也会抛出异常。
答案 4 :(得分:1)
像其他回答者一样,我不太确定你要求的是什么,但是你希望尽可能少的时间和最大的时间(不仅仅是一天),那么DateTime.MinValue
和DateTime.MaxValue
返回1/1/0001 12:00:00 AM
分别于12/31/9999 11:59:59 PM。
答案 5 :(得分:1)
我建议你看看这个答案: How can I specify the latest time of day with DateTime
如果您的原始日期时间也可能包含时间,则使用AddDays()方法将添加完整的24小时,这可能不是您想要的。
答案 6 :(得分:1)
public static DateTime ToEndOfDay(this DateTime time)
{
var endOfDaySpan = TimeSpan.FromDays(1).Subtract(TimeSpan.FromMilliseconds(1));
return time.Date.Add(endOfDaySpan);
}
答案 7 :(得分:1)
你必须小心使用
(new DateTime()).AddDays(1).AddTicks(-1);
传递给存储过程时。
可能会发生该值将近似于第二天。
答案 8 :(得分:0)
请注意,如果您将此时间传递给sql server,则应使用
dateTime.Date.AddDays(1).AddMilliseconds(-3);
请参阅:
答案 9 :(得分:0)
DateTime.Today.AddDays(1).AddSeconds(-1);
不是很确切,但解决了我的问题。现在我们可以使用AddMilliseconds,AddTicks等。我认为它只会满足您的需求。