我正在使用System.DateTime
对象来允许用户选择日期范围。用户只能使用第三方日历选择日期(而不是时间),因此我需要在日期之后自动指定应该使用的时间(即:00:00:00或23:59:59)被选中。
如何指定日历选择器已将日期存储为DateTime对象后的时间?我可以使用AddHours, AddMinutes, AddSeconds
方法,但这些方法与当前时间相关,可能不是00:00:00。
startDate
需要有00:00:00的时间,而endDate
的时间应为23:59:59才能占用整个时间。
答案 0 :(得分:87)
如果您已经创建了DateTime
个对象,并希望将该时间替换为该给定日期的晚上11:59:59,那么您可以使用.Date
属性来获取日期和时间设置为00:00:00然后添加小时,分钟和秒。例如:
var dt = yourDateInstance.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
如果到了最晚时间,你的意思是晚上11:59:59,那么这也应该有效:
var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59);
答案 1 :(得分:68)
为了获得今天的最后一刻:
DateTime d = new DateTime(Now.Year, Now.Month, Now.Day);
d = d.AddDays(1);
d = d.AddTicks(-1);
为了回应你的编辑,这就是我要做的事情:
DateTime start = new DateTime(Now.Year, Now.Month, Now.Day);
DateTime end = start.AddDays(1).AddTicks(-1);
// Or - just use end = start.AddDays(1), and use a < for comparison
答案 2 :(得分:18)
DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);
答案 3 :(得分:11)
您的问题已经得到解答,但恕我直言更好的方法是不要试图从范围的末尾减去一个刻度,一秒或其他任何东西,并严格使用小于。
。因此,如果您希望包含范围内的所有日期从startDate到endDate,忽略时间,则可以在C#中使用以下内容:
if ((myDate >= startDate.Date) && (myDate < endDate.Date.AddDays(1)))
{
// ... it's in the range
}
或在T-SQL中,假设您的@StartDate和@EndDate恰好是午夜,例如:
WHERE SomeDate >= @StartDate AND SomeDate < DATEADD(d,1,@EndDate)
<强>更新强>
更新了示例,以显示回应评论的包含范围。
答案 4 :(得分:6)
DateTime startDate = DateTime.Today;
DateTime stopDate = startDate.AddDays(1).AddTicks(-1);
作为备注,DateTime.Today
返回(来自MSDN)
System.DateTime设置为今天的日期, 将时间组件设置为 00:00:00。
正如其他人已经注意到的那样,添加一天,然后减去最小的时间量(一个刻度),你得到当天最后一次可能的时间。
当然,您可能需要考虑TimeZones,这取决于代码运行的位置与用户所在的位置。 UTC时间可能不错,但这可能会让你失去一天(无论哪种方式),具体取决于代码的运行位置。
答案 5 :(得分:2)
为什么不 ToDayEnd ()扩展名
/// <summary>
/// Gets the value of the End of the day (23:59)
/// </summary>
/// <param name="target"></param>
/// <returns></returns>
public static DateTime ToDayEnd(this DateTime target)
{
return target.Date.AddDays(1).AddMilliseconds(-1);
}
但是,如果您真的要说一天的绝对结束,那么答案就是AddTicks(-1)。
答案 6 :(得分:1)
例如
DateTime.Now.Date.AddDays(1).AddSeconds(-1)
或AddTicks/AddMilliseconds/AddMinutes
...基于您需要的精度。
答案 7 :(得分:1)
基于其他答案,我创建了这种方便的扩展方法:
public static class DateTimeExtensions
{
public static DateTime EndOfDay(this DateTime dateTime)
{
return dateTime.Date.AddDays(1).AddTicks(-1);
}
}
答案 8 :(得分:1)
使用扩展方法
public static DateTime EndOfTheDay(this DateTime date)
{
return new DateTime(date.Year, date.Month, date.Day).AddDays(1).AddTicks(-1);
}
这里的结果将通过一天的开始为您提供最新的时间-添加一天,然后减去一个勾。 其他方法增加了小时,分钟和秒,但是那些依赖于代码功能的解决方案将在23:59:59.000000和23:59:59.999999之间的任何时间引起问题。
例如,如果我想知道某个值是否在某个结束日期/时间之前,则其他解决方案的可能性是它们会错过毫秒范围内的值。
答案 9 :(得分:0)
使用此
DateTime YourNewDate = new DateTime(YourDate .Year,YourDate .Month,YourDate .Day,23,59,59,99);
答案 10 :(得分:0)
yourDateInstance.CloseDate = yourDateInstance.CloseDate.Date.AddDays(1).AddMilliseconds(-1);
答案 11 :(得分:0)
这会给你预期的结果:
DateTime startDate= DateTime.Now.Date;
DateTime endDate= startDate.AddDays(2).Add(new TimeSpan(23, 59, 59));
//startDate: 28/9/2017 0:0:0 endDate: 29/9/2017 23:59:59