DateTime.Now - 一天中的第一分钟和最后一分钟

DateTime.Now - first and last minutes of the day

提问人:Rod 提问时间:7/29/2010 最后编辑:idbriiRod 更新时间:6/19/2021 访问量:48449

问:

有没有简单的方法可以得到 的 “” 和 “”?DateTimeTimeMinTimeMax

TimeMin:一天中的第一刻。在此之前没有发生,并且仍然在同一天发生。DateTime

TimeMax:一天中的最后一刻。在此之后没有发生,并且仍然在同一天发生。DateTime

这些值有助于筛选和执行与日期相关的查询。

C# 日期时间

评论

8赞 Fosco 7/29/2010
你的意思是 00:00:00.000 和 23:59:59.999 ?
2赞 Hans Passant 7/29/2010
试图准备你的软件,以便它有一天可以在火星上使用?
0赞 Oded 7/29/2010
“TimeMin”和“TimeMax”是什么意思?完全?
1赞 hunter 7/29/2010
这对于筛选和执行与日期相关的查询很有帮助
4赞 Anthony Pegram 7/29/2010
措辞的小问题。DateTime.Now (或多或少)恰好是现在。它的最短时间是现在。它的最大时间是现在。您想要的是给定一天的最小和最长时间,而不是给定的现在

答:

115赞 hunter 7/29/2010 #1

以下是我用来做到这一点的两个扩展。

    /// <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());

评论

0赞 Daniel Dyson 7/29/2010
AbsoluteStart 可以与 DateTime.Now.Date 一起使用
3赞 Powerlord 7/29/2010
DateTime.Now.AbsoluteStart()是多余的,因为它与 相同。 是“设置为今天日期的对象,时间部分设置为 00:00:00。DateTime.TodayDateTime.Today
11赞 hunter 7/29/2010
我们并不总是想要今天
7赞 Jack 7/29/2010
我最喜欢这个,尽管我可能会建议更改返回 AbsoluteStart(dateTime)。AddDays(1)。AddMilliseconds(-1);返回 AbsoluteStart(dateTime)。AddDays(1)。添加滴答声(-1);尽管不太可能,但您仍然可以在第二天获得介于 23:59:59.999 和 00:00:00.000 之间的 DateTime,因为 DateTime 下降到 Ticks 保真度。
1赞 sondergard 1/26/2016
请注意,不要无意中在 DateTime.MaxValue 上调用 AbsoluteEnd。这将引发 ArgumentOutOfRangeException。另一种方法是添加刻度:AbsoluteStart(dateTime)。添加滴答声(863999999999)
11赞 Daniel Dyson 7/29/2010 #2

尝试

//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)

评论

2赞 Anthony Pegram 7/29/2010
事实证明,它总是会发生两天
14赞 Mark Byers 7/29/2010 #3

我会使用以下内容:

DateTime now = DateTime.Now;
DateTime startOfDay = now.Date;
DateTime endOfDay = startOfDay.AddDays(1);

并使用 代替 .这意味着无论精度是分钟、秒、毫秒、刻度还是其他值,它都会起作用。这将防止像我们在 StackOverflow 上遇到的错误(尽管建议被忽略了)。< endOfDay<= endOfDay

请注意,如果您想要同一天的开始和结束,请务必只拨打一次电话。DateTime.Now

评论

0赞 hunter 7/29/2010
我认为关键是在第一个和最后一个时刻获得一个日期,并不总是用于计算,但主要用于计算
1赞 Marty Neal 7/29/2010 #4

像其他回答者一样,我不太确定你在问什么,但如果你想要尽可能短的时间和尽可能长的时间,(不仅仅是一天),那么就有和返回 1/1/0001 12:00:00 AM 和 12/31/9999 晚上 11:59:59。DateTime.MinValueDateTime.MaxValue

1赞 Mir 12/8/2012 #5

我建议你看看这个答案:如何使用 DateTime 指定一天中最晚的时间

如果原始 DateTimes 还可能包含时间,则使用 AddDays() 方法将添加整整 24 小时,这可能不是您想要的。

1赞 zoltanflavius 5/9/2013 #6
    public static DateTime ToEndOfDay(this DateTime time)
    {
        var endOfDaySpan = TimeSpan.FromDays(1).Subtract(TimeSpan.FromMilliseconds(1));
        return time.Date.Add(endOfDaySpan);
    }
3赞 dgelormini 7/15/2013 #7

对上面的猎人解决方案进行一个小调整...... 我使用以下扩展方法来获取一天的结束:

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.MinValueDateTime.MaxValueDateTime.MinValue

1赞 DShook 9/30/2013 #8

请注意,如果要将此时间传递给 sql server,则应使用

dateTime.Date.AddDays(1).AddMilliseconds(-3);

看:

如何获取特定一天的最后可能时间

2赞 gimol79 1/14/2016 #9

使用时一定要小心

(new DateTime()).AddDays(1).AddTicks(-1);

当它被传递给存储过程时。

该值可能会近似到第二天。

0赞 Clyde 11/23/2017 #10
DateTime.Today.AddDays(1).AddSeconds(-1);

不是很准确,但解决了我的问题。现在我们可以使用 AddMilliseconds、AddTicks 等。我认为它只会因满足您的需求而有所不同。