【问题标题】:DateTime.Now - first and last minutes of the dayDateTime.Now - 一天的第一分钟和最后一分钟
【发布时间】:2010-07-29 13:29:40
【问题描述】:

有没有什么简单的方法可以得到DateTime的“TimeMin”和“TimeMax”?

TimeMin:一天的第一刻。没有DateTime 出现在之前这个并且仍然在同一天出现。

TimeMax: 一天的最后一刻。没有DateTime 出现在之后这个并且仍然在同一天出现。

这些值将有助于过滤和执行与日期相关的查询。

【问题讨论】:

  • 你的意思是 00:00:00.000 和 23:59:59.999 ?
  • 尝试准备您的软件,以便有一天它可以在火星上使用?
  • “TimeMin”和“TimeMax”是什么意思?对吗?
  • 这有助于过滤和进行与日期相关的查询
  • 措辞的小问题。 DateTime.Now (或多或少)精确地现在。它的最小时间是现在。它的最大时间是现在。您想要的是给定 day 的最小和最大时间,而不是给定的 now

标签: c# datetime


【解决方案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());

【讨论】:

  • AbsoluteStart 可以替换为 DateTime.Now.Date
  • DateTime.Now.AbsoluteStart() 是多余的,因为它与DateTime.Today 相同。 DateTime.Today 是“设置为今天日期的对象,时间组件设置为 00:00:00。” -- MSDN
  • 我们并不总是想要今天
  • 我最喜欢这个,虽然我可能会建议更改 return AbsoluteStart(dateTime).AddDays(1).AddMilliseconds(-1);返回 AbsoluteStart(dateTime).AddDays(1).AddTicks(-1);由于 DateTime 下降到 Ticks 保真度,您仍然可以获得介于 23:59:59.999 和第二天 00:00:00.000 之间的 DateTime。
  • 请注意不要在 DateTime.MaxValue 上无意中调用 AbsoluteEnd。这将引发 ArgumentOutOfRangeException。另一种方法是添加刻度:AbsoluteStart(dateTime).AddTicks(863999999999)
【解决方案2】:

我会使用以下内容:

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

并使用&lt; endOfDay 而不是&lt;= endOfDay。这意味着无论精度是分钟、秒、毫秒、滴答声还是其他东西,它都可以工作。这将防止像the one we had on StackOverflow 这样的错误(尽管建议是ignored)。

请注意,如果您想要同一天的开始和结束,请务必只调用一次DateTime.Now

【讨论】:

  • 我认为关键是要在第一时间和最后一刻获取日期,并不总是用于计算,而是主要用于计算
【解决方案3】:

试试

//midnight this morning
DateTime timeMin = DateTime.Now.Date; 
//one tick before midnight tonight
DateTime timeMax = DateTime.Now.Date.AddDays(1).AddTicks(-1) 

如果您使用它进行过滤,正如您的 cmets 建议的那样,最好将 DateTime.Now 保存到一个变量中,以防两个调用之间的日期发生变化。不太可能,但调用它足够多次,它不可避免地会在某一天(而不是晚上)发生。

DateTime currentDateTime = DateTime.Now;
DateTime timeMin = currentDateTime.Date; 
DateTime timeMax = currentDateTime.Date.AddDays(1).AddTicks(-1)

【讨论】:

  • 事实证明,它总是会发生 两天 天。
【解决方案4】:

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

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.MinValueDateTime.MaxValue 的情况。如果你在 DateTime.MaxValue 上调用 AddDays(1),你会得到一个异常。同样,在DateTime.MinValue 上调用 AddTicks(-1) 也会抛出异常。

【讨论】:

    【解决方案5】:

    一定要小心使用

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

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        我建议你看看这个答案: How can I specify the latest time of day with DateTime

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

        【讨论】:

          【解决方案8】:
              public static DateTime ToEndOfDay(this DateTime time)
              {
                  var endOfDaySpan = TimeSpan.FromDays(1).Subtract(TimeSpan.FromMilliseconds(1));
                  return time.Date.Add(endOfDaySpan);
              }
          

          【讨论】:

            【解决方案9】:

            请注意,如果您将这段时间传递给 sql server,您应该使用

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

            见:

            How do I get the last possible time of a particular day

            【讨论】:

              【解决方案10】:
              DateTime.Today.AddDays(1).AddSeconds(-1);
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-09-28
                • 2021-09-28
                • 2016-05-12
                • 1970-01-01
                • 2019-07-25
                • 1970-01-01
                • 1970-01-01
                • 2022-01-11
                相关资源
                最近更新 更多