在.NET中获取日期和时间

时间:2012-03-09 07:16:31

标签: .net datetime

目前我正在尝试使用此代码获取时间和分钟:

DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Date.Hour;
int currentMin = DateTime.Now.Date.Minute;

但是我得到零而不是当前的时间和分钟。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:18)

您正在使用Date属性,该属性在给定的DateTime为您提供午夜。你现在只想要:

DateTime now = DateTime.Now;
int hour = now.Hour;
int minute = now.Minute;
DateTime date = now.Date; // If you really need it

请注意,我的代码只调用DateTime.Now 一次,而不是一次调用一次,然后一次调用 1 。这意味着如果你把它称为接近(比如)上午8点,你可能会得到7:59或者你可能会得到8点 - 但你将不会得到7:00或8:59,如果您有以下任何一种情况,您可以获得:

// Bad option 1 (could get 7:00)
int hour = DateTime.Now.Hour;
// Imagine the clock rolls over now...
int minute = DateTime.Now.Minute;

// Bad option 1 (could get 8:59)
int minute = DateTime.Now.Minute;
// Imagine the clock rolls over now...
int hour = DateTime.Now.Hour;

应该考虑不直接使用DateTime.Now。它有两个问题:

  • 它返回 local 时区的时间;这对于桌面应用程序来说可能没问题,但对服务器端应用程序来说却很糟糕
  • 很难测试

如果你创建一个IClock接口或类似的东西,它有一个方法或属性来给你当前的UTC时间,你可以随时将它转换为当地时间(明确地说,这不是真的,反向)你也可以为测试目的注入一个虚假的实现。

编辑:一个简短但完整的程序来证明是的,这段代码确实 工作:

using System;

public class Test
{
    static void Main(string[] args)
    {
        DateTime now = DateTime.Now;
        int hour = now.Hour;
        int minute = now.Minute;
        Console.WriteLine(hour);
        Console.WriteLine(minute);
    }
}

在我的机器上,打印7然后打印35.如果它打印0然后打印0,那么它必须是您机器的午夜。


1 正如您所注意到的,我已经对所有继续执行此操作的答案添加了评论。抱歉,如果这看起来像垃圾邮件,但我想引起那些回答者的注意 - 这是一个常见的错误,我想帮助根除。如果没有评论,海报可能会在没有再看的情况下继续前进......

答案 1 :(得分:2)

DateTime.Date属性returns

  

与此实例具有相同日期的新对象和时间值   设置为午夜12:00:00(00:00:00)。

因此,完全可以预期你会在“时间”字段中获得全部零。

只是不要使用Date属性,而是直接在Hour上调用MinuteDateTime.Now

请注意,要获得一致的值(以及出于性能原因),您应该存储当前的DateTime.Now结果并对其进行处理:

DateTime now = DateTime.Now;
DateTime currentDate = now.Date;
int currentHour = now.Hour;
int currentMinute = now.Minute;

最后请注意,只要您不“查看”时间分数,根本不使用DateTime.Date,只需使用DateTime.Now结果。

答案 2 :(得分:1)

这是因为Date删除了DateTime的时间部分,因此Date.HourDate.Minute将始终为00:00。试试这个:

DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Hour;
int currentMin = DateTime.Now.Minute;

修改 根据Jon Skeet的评论,我完全同意。我只做了最小的改动,删除了给他问题的问题,特别是对.Date的调用。

在实际情况下,您应该使用DateTime.Now一次,首先获取时间,然后提取您需要的部分,以确保提取完全相同的时间部分,并且两者之间没有变化。我不会在这里编写代码,因为它是Jon的答案的副本,所以请看他的答案以获取详细信息。

答案 3 :(得分:0)

Date属性不包含有关小时,分钟,秒,毫秒的任何信息。简单地使用DateTime.Now。

答案 4 :(得分:0)

应该是:

DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Hour;
int currentMin = DateTime.Now.Minute;