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

时间:2009-05-04 19:04:07

标签: .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才能占用整个时间。

12 个答案:

答案 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