2012-03-09 78 views
2

目前我正在使用此代码来获取小时和分钟:获取日期和时间在.NET

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

但我正在逐渐零,而不是当前的小时和分钟。我该如何解决这个问题?

+1

尽管有标签,但这完全与C#语言无关。这只是.NET。 (现在已修复) – 2012-03-09 07:23:08

+1

我知道你已经有了正确的答案,但只是要知道你的问题是“DateTime.Now.Date”,你应该使用“DateTime.Now” – 2012-03-09 10:25:54

回答

17

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

​​

请注意,我的代码仅适用于小时分钟调用DateTime.Now一次,而不是一次,然后一次。这意味着如果你称它接近(说)8  上午,你可能会得到7:59或者你可能会得到8:00 - 但你不会得到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直接的。它有两个问题:

  • 它返回本地时区的时间;这可能好于桌面应用程序,但不适合服务器端应用程序
  • 很难测试

如果您创建一个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,那么你的机器一定是午夜。


正如你可能会注意到,我已经添加到所有继续做这个答案的注释。道歉,如果这看起来像垃圾邮件,但我想要得到那些回答者的注意 - 这是一个常见的错误,我想帮助根除。如果没有评论,海报可能会在没有再次查看的情况下继续前进......

+0

它不起作用 – 2012-03-09 07:19:54

+1

Works for fine for我。 – 2012-03-09 07:20:53

+0

它是如何工作的? – 2012-03-09 07:20:59

0

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

1

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

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

编辑 根据乔恩斯基特的评论,我完全同意。我只是做了最小的改变,以消除给他提出问题的问题,特别是致电.Date

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

+0

谢谢它适合我。 – 2012-03-09 07:22:42

+2

反复使用'DateTime.Now'是一个非常糟糕的主意,而不是一次评估*。详情请参阅我的回答。 – 2012-03-09 07:27:01

+0

我认为将代码放在这里会更好,因为这会作为接受的答案,因此我们需要让其他人更好地查看/查看答案。 – V4Vendetta 2012-03-09 07:35:42

0

应该是:

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

请阅读我的答案,为什么这个代码是一个坏主意 - 想想如果你开始执行这个*会发生什么,只是*在一小时的开始之前...... – 2012-03-09 07:30:22

+0

谢谢@Jon :)你的回答很有意义。 – gideon 2012-03-09 09:38:04

2

DateTime.Date财产returns

用相同的日期作为该实例的新对象,而时间值 设定为12:00:00午夜(00 :00:00)。

所以完全预计你会得到所有的“时间”字段的零。

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

注意,获得一致的值(和性能方面的原因),您存储前人的精力当前DateTime.Now结果,并在有效的:

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

最后,需要注意的是,只要你不“看看“时间分数,根本没有使用DateTime.Date,只需使用DateTime.Now结果即可。