Получить дату и время в .NET - PullRequest
3 голосов
/ 09 марта 2012

В настоящее время я пытаюсь получить часы и минуты, используя этот код:

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

Но вместо этого я получаю ноль вместо текущего часа и минуты.Как я могу решить эту проблему?

Ответы [ 5 ]

18 голосов
/ 09 марта 2012

Вы используете свойство 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: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, то на вашем аппарате должна быть полночь.


1 Как вы можете заметить, я добавил комментарий ко всем ответам, которые продолжают это делать. Извиняюсь, если это выглядит как спам, но я хотел привлечь внимание тех, кто отвечает - это распространенная ошибка, которую я хотел бы помочь устранить. Вполне возможно, что без комментариев постеры просто переместились бы, даже не посмотрев снова ...

2 голосов
/ 09 марта 2012

Свойство DateTime.Date возвращает

Новый объект с такой же датой, как у этого экземпляра, и значением времени установить 12:00:00 полночь (00:00:00).

Так что вполне ожидаемо, что вы получите все нули для полей "времени".

Просто не используйте свойство Date, но вызывайте Hour и Minute непосредственно для DateTime.Now.

Обратите внимание, что для получения согласованных значений (и по соображениям производительности) вы должны сохранить текущий результат DateTime.Now и поработать над этим:

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

Наконец, обратите внимание, что пока вы не «смотрите» на долю времени, нет смысла использовать DateTime.Date вообще, просто используйте результат DateTime.Now.

1 голос
/ 09 марта 2012

Это потому, что 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 один раз, сначала, чтобы получить время,а затем извлеките части, которые вам нужны, чтобы убедиться, что вы извлекаете части в одно и то же время, и это не изменилось между ними.Я не собираюсь писать этот код здесь, так как это будет копия ответа Джона, так что смотрите его ответ для деталей.

0 голосов
/ 09 марта 2012

Должно быть:

DateTime currentDate = DateTime.Now.Date;
int currentHour = DateTime.Now.Hour;
int currentMin = DateTime.Now.Minute;
0 голосов
/ 09 марта 2012

Свойство Date не содержит никакой информации о часах, минутах, секундах, миллисекундах. Используйте просто DateTime.Now.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...