2013-10-24 4 views
0

В моем проекте я создал ярлык, чтобы показать время начала и две кнопки, чтобы настроить его, один добавляет 15 минут для каждого щелчка, а другой вычитает 15 минут. Код выглядит следующим образомVB.NET DateTime исключение из диапазона

Label1.text = "04:30 AM" 
Private Sub Btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Add.Click, Btn_Sub.Click 
Dim btn_clicked As Button = Ctype(sender, Button) 
If btn_clicked.Name = "Btn_Add" Then 
    Label1.text = Ctype(Label.text, DateTime).AddMinutes(15).ToString("hh:mm tt") 
ElseIf btn_clicked.Name = "Btn_Sub" Then 
    Label1.text = Ctype(Label.text, DateTime).AddMinutes(-15).ToString("hh:mm tt") 
End If 
End Sub 

Кнопки отлично работают на первый, но если я продолжу нажав кнопку Вычесть, я надеюсь, что время будет меняться в цикле, например, 4:30 AM -> 4:15 AM -> ... -> 12:15 AM -> 12:00 AM -> 23:45 PM -> 23:30

Но как только произойдет прыжок в середине ночи, исключение выйдет,

System.ArgumentOutOfRangeException был необработанным Сообщение = "Указанный аргумент вышел за пределы допустимых значений."

Как это могло случиться? Минимальное значение для даты и времени - 00: 00: 00.0000000, 1 января 0001 года на MSDN. Нужно ли мне назначать дату года в качестве начального значения?

Спасибо!

+0

Вы должны помнить месяц/день/год своего значения DateTime и счета для этого. –

+3

Вы собираетесь поразить этот особый момент в Вифлееме, когда календарь начался с 0. DateTime не поддерживает даты до этого. Лучше не заставлять ваш код зависеть от того, что произошло две тысячи лет назад, вместо этого используйте TimeSpan. Обратите внимание, что это метод ToString() причудливый, проверьте MSDN. –

+0

@ HansPassant - 'TimeSpan' здесь не поможет. Вычитание 15 минут с полуночи должно быть 23:45 дня предыдущего дня. Использование 'TimeSpan' сделает его' -0: 15: 00'. TimeSpan рассчитан на истекшую продолжительность, а не на время суток. –

ответ

1

Попробуй как этот

Private Sub Btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Add.Click, Btn_Sub.Click 
    Dim btn_clicked As Button = CType(sender, Button) 
    Static startTime As DateTime = #12/30/5000 4:30:00 AM# 
    If btn_clicked.Name = "Btn_Add" Then 
     startTime = startTime.AddMinutes(15) 
     Label1.text = startTime.ToString("hh:mm tt") 
    ElseIf btn_clicked.Name = "Btn_Sub" Then 'in the OP this said Btn_Add also 
     startTime = startTime.AddMinutes(-15) 
     Label1.text = startTime.ToString("hh:mm tt") 
    End If 
End Sub 
+0

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

+0

Потому что я скопировал код OP, duh! на меня. Исправлена. – dbasnett

+1

Да, я тоже ударил. (Не видел ответа раньше, так что удалил мой.) Кроме того, он может захотеть предварительно загрузить ярлык на загрузку формы перед первым нажатием кнопки. –