2012-03-09 3 views
2

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

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

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

+1

Несмотря на теги, это вообще не имеет никакого отношения к языку C#. Это просто .NET. (Исправлено сейчас.) –

+1

Я знаю, что у вас уже есть правильный ответ, но для того, чтобы узнать вашу проблему, это был «DateTime.Now.Date», вы должны были использовать «DateTime.Now» –

ответ

17

Вы используете свойство Date, которое дает вам полночь в заданное время. Вы просто хотите Сейчас:

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

Обратите внимание, что мой код только вызывает DateTime.Nowраз, а не один раз в течение нескольких часов, а затем один раз в течение минут . Это означает, что если вы назовете это близко (скажем) 8   AM, вы можете получить 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, вы можете всегда преобразовать это в локальное время, если хотите (однозначно, что неверно в обратном порядке), и вы также можете ввести поддельную реализацию для целей тестирования.

EDIT: короткая, но полная программа, чтобы доказать, что да, этот код действительно делает работы:

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

он не работает –

+1

Прекрасно работает меня. –

+0

Как это работает? –

0

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

1

Это происходит потому, что Date удалили часть времени в DateTime, так Date.Hour и Date.Minute всегда будет 00:00. Попробуйте вместо этого:

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

EDIT Согласно комментарий Джона Скита, я полностью согласен.Я просто сделал самое маленькое изменение, которое устранило проблему, которая давала ему проблему, в частности, вызов .Date.

В реальной ситуации вы должны использовать DateTime.Now один раз, сначала получить время, а затем извлечь части, необходимые для того, чтобы вы извлекли части того же времени, и это не изменилось между ними , Я не буду писать этот код здесь, так как это будет копия ответа Джона, поэтому посмотрите на его ответ за подробностями.

+0

Спасибо, что работает для меня. –

+2

Неплохая идея использовать 'DateTime.Now' несколько раз, а не оценивать ее * один раз *. См. Мой ответ для деталей. –

+0

Я думаю, что было бы лучше иметь этот код здесь, так как это будет отображаться как принятый ответ, нам нужно лучше дать ответы другим, чтобы другие просмотрели/увидели. – V4Vendetta

0

Должно быть:

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

Пожалуйста, прочитайте мой ответ, почему этот код - плохая идея - подумайте о том, что произойдет, если вы начнете выполнение этого * просто * до начала часа ... –

+0

Спасибо @Jon :) Ваш ответ имеет большой смысл. – gideon

2

DateTime.Date свойство returns

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

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

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

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

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

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

Смежные вопросы