如何将当前日期设置为午夜时间?

95
每当我在我的mvc3应用程序中创建一个非空的datetime时,它都会默认为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; } } 

如何为非空日期时间设置当前日期的12am?

7个回答

159
你可以使用DateTime对象的Date属性,例如:
DateTime midnight = DateTime.Now.Date;

所以你的代码示例变成了

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

顺便提一句,如果你回到原始代码并将小时设置为12,会得到当天中午12:00的时间,所以你可以使用0代替...

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

22
还有一个 DateTime.Today - Erv Walter
3
如果你反编译微软的dll,你会发现Today只是一个对DateTime.Now.Date的包装器 - 所以在我看来,这只是表明我的代码意图更清晰... - Chris Moutray
我不同意。今天的含义就是今天。当谈论一天时,我从不假设时间。说Now.Date太啰嗦了。 - Justin Pihony
4
想到“Now.Date”这个额外的3个字符太啰嗦了,我不禁发笑。 - Chris Moutray
14
关于最后一行:永远不要在同一表达式中多次调用Now属性的getter函数。Now会改变!如果代码运行在Day(以及可能的MonthYear)改变的时间附近,它将给出错误的输出。例如Now的第一个结果可能是“11月30日23:59:59.9999...”,而最后一个结果可能是“12月1日00:00:00.0000...”。你的结果可能会差很远,比如说会显示成11月1日 - Jeppe Stig Nielsen

51

这不是答案,但它对我有所帮助 :-) - vNext
2
@vNext 是的,它确切地回答了问题,并且是最简洁的答案。 - Jamie Kitson

9

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

将日期设置为时间组件为 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));

1
你的GetDateZeroTime实现等同于访问DateTime对象的Date属性,即date.Date。 - djoyce

6

只需要将其设置为

DateTime.Now.Date

这样就可以了。

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

它显示在我的机器上是

"2017-04-08 00:00:00"


1

相关的,所以我想为其他人发布。如果您想找到今天开始的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);

0
大多数建议的解决方案可能会导致由于每个日期所关联的时间而引起1天的误差。如果您正在寻找两个日期之间的整数天数,而不考虑每个日期所关联的时间,则我发现以下方法效果很好:
return (dateOne.Value.Date - dateTwo.Value.Date).Days;

-1

试试这个:

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

输出将会是这样的:

2015年07月29日 00:00:00


这个问题已经有一个受欢迎且被接受的答案。请阅读它及其评论 - 它们解释了为什么您的方法真的不是一个好主意。 - vesan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接