如何使用DateTime指定一天中的最新时间

Joe*_*ips 69 .net datetime

我正在使用一个System.DateTime对象来允许用户选择日期范围.用户只能使用第三方日历选择日期(而不是时间),因此我需要在日期之后自动指定应该使用的时间(即:00:00:00或23:59:59)被选中.

如何指定日期选择器已将日期存储为DateTime对象后的时间?我可以使用这些AddHours, AddMinutes, AddSeconds方法,但这些方法与当前时间相关,可能不是00:00:00.

startDate将需要有时间是00:00:00,并endDate有一23:59:59时间占到整个天.

Jos*_*lio 94

如果您已经DateTime创建了一个对象并想要在该给定日期的晚上11:59:59更换时间,那么您可以使用该.Date属性获取时间设置为00:00:00然后添加小时,分钟和秒.例如:

var dt = yourDateInstance.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
Run Code Online (Sandbox Code Playgroud)

如果到了最晚时间,你的意思是晚上11:59:59,那么这也应该有效:

var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59);
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,"当天的最新时间"也会有最大的刻度数.最快的答案:DateTime.Today.AddDays(1).AddTicks(-1); (8认同)

Jon*_*n B 73

要获得今天的最后一刻:

DateTime d = new DateTime(Now.Year, Now.Month, Now.Day);
d = d.AddDays(1);
d = d.AddTicks(-1);
Run Code Online (Sandbox Code Playgroud)

为了回应您的编辑,这是我要做的:

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
Run Code Online (Sandbox Code Playgroud)

  • 这假设时间已经设置为00:00:00,这可能不是一个安全的假设.你能以某种方式直接设定时间吗? (2认同)

Pet*_*ier 19

DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 11

你的问题已经得到了解答,但恕我直言更好的方法是不要试图从范围的末尾减去一个滴答,一秒或其他任何东西,并严格按照比较小于.

因此,如果您希望包含范围内的所有日期从startDate到endDate,忽略时间,则可以在C#中使用以下内容:

if ((myDate >= startDate.Date) && (myDate < endDate.Date.AddDays(1)))
{
    // ... it's in the range
}
Run Code Online (Sandbox Code Playgroud)

或者在T-SQL中,假设您的@StartDate和@EndDate恰好是午夜,例如:

WHERE SomeDate >= @StartDate AND SomeDate < DATEADD(d,1,@EndDate)
Run Code Online (Sandbox Code Playgroud)

UPDATE

更新示例以显示响应评论的包含范围.


Hei*_*tad 8

基于其他答案,我创建了这个方便的扩展方法:

public static class DateTimeExtensions
{
    public static DateTime EndOfDay(this DateTime dateTime)
    {
        return dateTime.Date.AddDays(1).AddTicks(-1);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*Ken 8

使用扩展方法

public static DateTime EndOfTheDay(this DateTime date)
{
    return new DateTime(date.Year, date.Month, date.Day).AddDays(1).AddTicks(-1);
}
Run Code Online (Sandbox Code Playgroud)

这里的结果将通过获取一天的开始时间为您提供可能的最晚时间 - 添加一天,然后减去一个刻度。其他方法添加小时、分钟和秒,但是这些取决于代码功能的解决方案将在 23:59:59.000000 和 23:59:59.999999 之间的任何时间引起问题

例如,如果我想知道某个值是否在某个结束日期/时间之前,其他解决方案可能会错过毫秒范围内的值。

  • 更简单: return date.Date.AddDays(1).AddTicks(-1); (2认同)

Eri*_*bal 6

DateTime startDate = DateTime.Today;
DateTime stopDate = startDate.AddDays(1).AddTicks(-1);
Run Code Online (Sandbox Code Playgroud)

作为注释,DateTime.Today返回(来自MSDN)

System.DateTime设置为今天的日期,时间组件设置为00:00:00.

正如其他人所指出的那样,添加一天,然后减去最小的时间量(一个刻度),你得到当天最后一次可能的时间.

当然,您可能需要考虑TimeZones,这取决于代码运行的位置与用户所在的位置.UTC时间可能会很好,但这可能会让你失去一天(无论哪种方式),具体取决于代码运行的位置.