在.NET中获取日期和时间

Riz*_*hid 3 .net datetime

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

DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Date.Hour;
int currentMin = DateTime.Now.Date.Minute;
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 18

您正在使用Date在给定DateTime给您午夜的属性.你现在只想要:

DateTime now = DateTime.Now;
int hour = now.Hour;
int minute = now.Minute;
DateTime date = now.Date; // If you really need it
Run Code Online (Sandbox Code Playgroud)

请注意,我的代码只调用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;
Run Code Online (Sandbox Code Playgroud)

应该考虑不要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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


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

  • @rizwanShahid:我给出了正确答案.真的,我.如果你在尝试我的代码时没有给出任何关于你所看到的内容的指示,你声称它不起作用也无济于事.(我自己只是仔细检查了一下,它给了我7小时,27分钟......我的当地时间都是正确的.你试过的时候看到了什么?) (4认同)
  • @rizwanShahid:实际上,Jon的解决方案比我的解决方案更正确,因为它可以解决可能发生的"故障",从XX:59到XX + 1:00之间的时间从获得小时和获得分钟的呼叫之间,而且它最绝对有效**. (3认同)
  • @rizwanShahid确实如此.我刚用我的编译器检查过. (2认同)
  • @rizwanShahid因为他是Jon Skeet. (2认同)