在C#中创建午夜时间的最佳方法

93
我需要创建一个午夜时间。
我刚刚执行了以下操作:
DateTime endTime = DateTime.Now;
endTime.Subtract(endTime.TimeOfDay);

尚未测试,我假设它可以工作,但是否有更好/更清晰的方法?

7个回答

190

4
值得考虑的是,人们通常认为午夜是一天中的最后一秒,而这实际上是一天中的第一秒(也就是另一个午夜)。因此,如果您想要达到午夜的普遍含义,请参考下面的Aruna回答(以及Paul Suart的评论)。 - trajekolus
@jdoer1997 - 这取决于你的应用程序在午夜需要执行什么操作。依赖日期、星期几等因素的应用程序可能希望在新的一天开始时进行日常任务处理。 - LT Dan
如果你需要处理多个时区,你可能需要小心使用DateTime.Today。在这种情况下,DateTime.UtcNow.Date可能会得到更理想的结果。 - undefined

26
DateTime endTime = DateTime.Now.Date;

现在 endTime.TimeOfDay.ToString() 返回值为 "00:00:00"


19

18
我认为 DateTime.Today.AddDays(1) 比这个更好。 - Ian Grainger

17

DateTime.Today


15
你可以使用DateTime.Today来获取午夜时刻的精确秒数。
    DateTime today = DateTime.Today;
    DateTime mid = today.AddDays(1).AddSeconds(-1);
    Console.WriteLine(string.Format("Today: {0} , Mid Night: {1}", today.ToString(), mid.ToString()));

    Console.ReadLine();

这应该打印出:

Today: 11/24/2016 10:00:00 AM , Mid Night: 11/24/2016 11:59:59 PM

这非常有帮助,而且正是我想要的。 - Matthias McCarthy
10
午夜是第一位——它是一天中的第一秒,而不是最后一秒。 - Paul Suart

1
var dateMidnight = DateTime.ParseExact(DateTime.Now.ToString("yyyyMMdd"), "yyyyMMdd", CultureInfo.InvariantCulture);

4
除了提供一些代码外,请添加一些关于你的解决方案为什么有效以及它与以前的解决方案有何不同的额外细节。 - wlh

-3
    private bool IsServiceDatabaseProcessReadyToStart()
    {
        bool isGoodParms = true;
        DateTime currentTime = DateTime.Now;
        //24 Hour Clock
        string[] timeSpan = currentTime.ToString("HH:mm:ss").Split(':');
        //Default to Noon
        int hr = 12;
        int mn = 0;
        int sc = 0;

        if (!string.IsNullOrEmpty(timeSpan[0]))
        {
            hr = Convert.ToInt32(timeSpan[0]);
        }
        else
        {
            isGoodParms = false;
        }

        if (!string.IsNullOrEmpty(timeSpan[1]))
        {
            mn = Convert.ToInt32(timeSpan[1]);
        }
        else
        {
            isGoodParms = false;
        }

        if (!string.IsNullOrEmpty(timeSpan[2]))
        {
            sc = Convert.ToInt32(timeSpan[2]);
        }
        else
        {
            isGoodParms = false;
        }

        if (isGoodParms == true )
        {
            TimeSpan currentTimeSpan = new TimeSpan(hr, mn, sc);
            TimeSpan minTimeSpan = new TimeSpan(0, 0, 0);
            TimeSpan maxTimeSpan = new TimeSpan(0, 04, 59);
            if (currentTimeSpan >= minTimeSpan && currentTimeSpan <= maxTimeSpan)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

1
欢迎来到StackOverflow。除了提供一些代码外,请提供关于您的解决方案为什么有效以及与之前的解决方案有何不同的额外细节。 - buczek

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