2016-12-06 2 views
0

Я занимаюсь созданием приложения для будильника в C# через Windows Forms. Пока у меня есть этот нерабочий раздел кода для проверки времени.C# - Будильник - два раза одинаковы

string alarm = this.dateTimePicker1.Text; 

if (DateTime.Now.ToString() == alarm) 
{ 
    MessageBox.Show("Alarm"); 
} 

DateTimePicker настроен на часы, минуты и секунды. Вышеприведенный код не отображает окно сообщения вообще. Где проблема в фрагменте?

Кроме того: есть ли более эффективные способы сделать будильник

+0

NineBerry, нет необходимости в дополнительном коде. Кода достаточно, чтобы увидеть проблему. – NikxDa

+0

Вы можете, когда пользователь вводит время запуска таймера, как это http://stackoverflow.com/a/7970754/2608451 –

ответ

2

Попробуйте это, чтобы ты:

нужно сравнить часы и минуты.

private void CheckTime() 
{ 
    clock.Text = DateTime.Now.ToString("hh:mm:ss"); 
    date.Text = DateTime.Now.ToLongDateString(); 
    DateTime alarm = this.dateTimePicker1.Value; 
    DateTime currentTime = DateTime.Now; 
    if (alarm.Hour == currentTime.Hour && alarm.Minute == currentTime.Minute) 
    { 
     timer1.Enabled = false; 
     MessageBox.Show("Alarm"); 

    } 
} 
+0

Действительно хороший, останавливает таймер, предотвращая попадание на экран большого количества ящиков сообщений. – EugeneProut

+1

Это очень краткий ответ, но нет объяснений, почему он работает. @ trickrider2002, этот ответ работает, потому что DateTime.Now собирается дать вам значение, которое включает секунды (и, возможно, миллисекунды в зависимости от того, как он используется). Это эквивалентно сравнению пары значений с плавающей запятой. Вам нужно округлить их до некоторых значений, которые могут быть осмысленно сопоставлены. Преобразование в часы и минуты делает это. – dviljoen

0

Modify ниже код по мере необходимости. Я считаю, что сравнение строк - это плохой способ сделать это.

DateTime alarm = this.dateTimePicker1.Value.Date; 
if (DateTime.Compare(DateTime.Now.Date, alarm) == 0) { 
    MessageBow.Show("Alarm"); } 
+2

При использовании DateTime.Compare не забывайте, что даты данных должны быть построены в том же часовом поясе. поэтому будьте осторожны с настройками вашей культуры и UICulture. –

+0

@GeckoIT очень правда! есть способ указать настройки культуры и UIculture. Я не собираюсь писать точный код, который вам нужен, но предоставить способ для этого человека понять (я думаю, это то, как люди лучше всего учатся). но вы сделали замечательный момент, определенно что-то нужно опасаться – peterpep

+0

Я думаю, что вы хотите '> 0', а не' == 0' – smead

1

Поскольку это будильник, вы захотите сделать сравнение, включая время. Тем не менее, сравнивать значения .Ticks ваших объектов DateTime:

if(DateTime.Now.Ticks >= this.DateTimePicker1.Value.Ticks) 
{ 
    // Sound the alarm 
} 

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

+0

Я не понимаю, почему вам нужно использовать Ticks, этого должно быть достаточно: 'DateTime.Now> this.DateTimePicker1.Value' – smead

+0

Поскольку Ticks - это базовое значение для объектов DateTime, оно немного более эффективно, но ваш способ тоже работает, и разница будет незначительной в приложении OP. – Kevin

0

Проблема в том, что вы ищете точное совпадение. Вместо этого вы должны смотреть, прошло ли время будильника (так что «> =»). Кроме того, сравнение строк не будет работать для даты. Вам нужно сравнить даты/времени:

 string alarm = this.dateTimePicker1.Value; 
     if (DateTime.Now() >= alarm) 
     { 
      MessageBox.Show("Alarm"); 
     } 
Смежные вопросы