目前我正在使用此代码来获取小时和分钟:获取日期和时间在.NET
DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Date.Hour;
int currentMin = DateTime.Now.Date.Minute;
但我正在逐渐零,而不是当前的小时和分钟。我该如何解决这个问题?
目前我正在使用此代码来获取小时和分钟:获取日期和时间在.NET
DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Date.Hour;
int currentMin = DateTime.Now.Date.Minute;
但我正在逐渐零,而不是当前的小时和分钟。我该如何解决这个问题?
您正在使用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,那么你的机器一定是午夜。
正如你可能会注意到,我已经添加到所有继续做这个答案的注释。道歉,如果这看起来像垃圾邮件,但我想要得到那些回答者的注意 - 这是一个常见的错误,我想帮助根除。如果没有评论,海报可能会在没有再次查看的情况下继续前进......
它不起作用 – 2012-03-09 07:19:54
Works for fine for我。 – 2012-03-09 07:20:53
它是如何工作的? – 2012-03-09 07:20:59
Date属性不包含有关小时,分钟,秒,毫秒的任何信息。只需使用DateTime.Now。
那是因为Date
删除了DateTime
的时间部分,所以Date.Hour
和Date.Minute
将始终为00:00。试试这个:
DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Hour;
int currentMin = DateTime.Now.Minute;
编辑 根据乔恩斯基特的评论,我完全同意。我只是做了最小的改变,以消除给他提出问题的问题,特别是致电.Date
。
在真实情况下,您应该使用DateTime.Now一次,首先获取时间,然后提取所需的部分,以确保您提取的部分完全相同的时间,并且在两者之间没有改变。我不打算在这里写这些代码,因为这是Jon的答案的副本,所以请看他的答案以获取详细信息。
谢谢它适合我。 – 2012-03-09 07:22:42
反复使用'DateTime.Now'是一个非常糟糕的主意,而不是一次评估*。详情请参阅我的回答。 – 2012-03-09 07:27:01
我认为将代码放在这里会更好,因为这会作为接受的答案,因此我们需要让其他人更好地查看/查看答案。 – V4Vendetta 2012-03-09 07:35:42
应该是:
DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Hour;
int currentMin = DateTime.Now.Minute;
请阅读我的答案,为什么这个代码是一个坏主意 - 想想如果你开始执行这个*会发生什么,只是*在一小时的开始之前...... – 2012-03-09 07:30:22
谢谢@Jon :)你的回答很有意义。 – gideon 2012-03-09 09:38:04
的DateTime.Date
财产returns
用相同的日期作为该实例的新对象,而时间值 设定为12:00:00午夜(00 :00:00)。
所以完全预计你会得到所有的“时间”字段的零。
只是不要使用Date
属性,而是直接在DateTime.Now
上调用Hour
和Minute
。
注意,获得一致的值(和性能方面的原因),您存储前人的精力当前DateTime.Now
结果,并在有效的:
DateTime now = DateTime.Now;
DateTime currentDate = now.Date;
int currentHour = now.Hour;
int currentMinute = now.Minute;
最后,需要注意的是,只要你不“看看“时间分数,根本没有使用DateTime.Date
,只需使用DateTime.Now
结果即可。
尽管有标签,但这完全与C#语言无关。这只是.NET。 (现在已修复) – 2012-03-09 07:23:08
我知道你已经有了正确的答案,但只是要知道你的问题是“DateTime.Now.Date”,你应该使用“DateTime.Now” – 2012-03-09 10:25:54