【问题标题】:How to set time to midnight for current day?如何将时间设置为当天的午夜?
【发布时间】:2012-11-20 05:42:15
【问题描述】:

每次我在我的 mvc3 应用程序中创建一个不可为空的日期时间时,它默认为 now(),其中 now 是当前日期和当前时间。我想将其默认为今天的日期,时间为上午 12 点。

我正在尝试在我的 mvc 中默认时间...但是...以下未设置为今天的日期@12am。相反,它默认使用当前日期和时间。

private DateTime _Begin = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 12, 0, 0);
public DateTime Begin { get { return _Begin; } set { _Begin = value; } } 

对于不可为空的日期时间,如何将当前日期设置为凌晨 12 点?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您可以使用 DateTime 对象的 Date 属性 - 例如

    DateTime midnight = DateTime.Now.Date;
    

    所以你的代码示例变成了

    private DateTime _Begin = DateTime.Now.Date;
    public DateTime Begin { get { return _Begin; } set { _Begin = value; } }
    

    PS。回到您的原始代码,将小时数设置为 12 将为您提供当天的 中午 时间,因此您可以使用 0 ...

    var now = DateTime.Now;
    new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
    

    【讨论】:

    • 还有DateTime.Today
    • @Erv 实际上,如果您反映(反汇编 M$ dll),您会发现 Today 只是 DateTime.Now.Date 的包装 - 所以我个人认为这只是在我的代码...
    • 我不同意。今天的含义正是它所说的。在谈论一天时,我从不假设时间。不得不说 Now.Date 过于冗长了。
    • 当我想到 Now.Date 对于额外的 3 个字符来说过于冗长...
    • 关于最后一行:从不在同一个表达式中多次调用Now 属性getter。 Now 变化!如果代码在Day(可能还有MonthYear)更改的时间附近运行,则会给出错误的输出。就像Now-s 中的第一个可能是“Nov. 30th, 23:59:59.9999...”,最后一个可能是“Dec. 1st, 00:00:00.0000...”。那么你的结果可能是 11 月 1 日,很遥远。
    【解决方案2】:

    我相信您正在寻找DateTime.Today。文档指出:

    设置为今天日期的对象,时间组件设置为 00:00:00。

    http://msdn.microsoft.com/en-us/library/system.datetime.today.aspx

    你的代码是

    DateTime _Begin = DateTime.Today;
    

    【讨论】:

    • 这不是答案,但对我有帮助:-)
    • @vNext 是的,它准确地回答了问题并且是最简洁的答案。
    【解决方案3】:

    使用上述一些建议,以下函数和代码可用于搜索日期范围:

    设置日期,时间组件设置为 00:00:00

    public static DateTime GetDateZeroTime(DateTime date)
    {
        return new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);
    }
    

    用法

    var modifieddatebegin = Tools.Utilities.GetDateZeroTime(form.modifieddatebegin);
    
    var modifieddateend = Tools.Utilities.GetDateZeroTime(form.modifieddateend.AddDays(1));
    

    【讨论】:

    • 你的GetDateZeroTime实现相当于访问DateTime对象的Date属性,即date.Date
    【解决方案4】:

    只需要设置为

    DateTime.Now.Date

    Console.WriteLine(DateTime.Now.Date.ToString("yyyy-MM-dd HH:mm:ss"));
    Console.Read();
    

    显示

    “2017-04-08 00:00:00”

    在我的机器上。

    【讨论】:

      【解决方案5】:

      相关,所以我想我会为其他人发帖。如果您想找到今天开始的 UTC(对于您的时区),以下代码适用于任何 UTC 偏移量(-23.5 到 +23.5)。这看起来像我们加 X 小时然后减去 X 小时,但重要的是加后的“.Date”。

      double utcOffset= 10.0;  // Set to your UTC offset in hours (eg. Melbourne Australia)
      var now = DateTime.UtcNow;
      
      var startOfToday = now.AddHours(utcOffset - 24.0).Date;
      startOfToday = startOfToday.AddHours(24.0 - utcOffset);
      

      【讨论】:

        【解决方案6】:

        大多数建议的解决方案可能会导致 1 天错误,具体取决于与每个日期关联的时间。如果您正在寻找日期之间的整数个日历日,无论与每个日期关联的时间如何,我发现这很有效:

        return (dateOne.Value.Date - dateTwo.Value.Date).Days;
        

        【讨论】:

          【解决方案7】:

          试试这个:

          DateTime Date = DateTime.Now.AddHours(-DateTime.Now.Hour).AddMinutes(-DateTime.Now.Minute)
             .AddSeconds(-DateTime.Now.Second);
          

          输出如下:

          07/29/2015 00:00:00

          【讨论】:

          • 这个问题已经有了一个广为接受和接受的答案。请阅读它及其 cmets - 它们解释了为什么您的方法确实不是一个好主意。
          猜你喜欢
          • 2014-08-26
          • 2013-11-22
          • 1970-01-01
          • 2012-01-11
          • 1970-01-01
          • 2015-03-20
          • 2020-02-05
          • 2014-11-29
          • 1970-01-01
          相关资源
          最近更新 更多