TimeOfDay.Hour сравнение

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

TimeOfDay.Hour сравнение

Сообщение Invader » 25.12.2011 (Вс) 11:06

Обращаюсь к XML документу,
+<vetka1 day=25 hour=14>
+<vetka2 day=25 hour=20>
+<vetka3 day=26 hour=02>
опустив детали документа, я опишу проблему. Я в программе вывожу содержимое ветки, соответствующей текущему времени:
для этого я определяю значение day и hour из xml
затем отправляю на сравнение
Код: Выделить всё
If TimeOfDay.Hour <= hour Andalso Date.Today.Day <= day Then
                      textbox1.text=soderjimoevetki
                Exit For
End If

и всё работает, но наступает момент , скажем системное время 21 час... и код логично, не находит ветви больше по времени.
Как мне объяснить машине, что в контексте времени суток, 02 больше 21???
умён и жаден,
характер отсуствует

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: TimeOfDay.Hour сравнение

Сообщение FireFenix » 25.12.2011 (Вс) 11:14

Invader писал(а):Как мне объяснить машине, что в контексте времени суток, 02 больше 21???

Изображение

Код: Выделить всё
If Date.Today.Day < day Then
    TextBox1.Text = soderjimoevetki
    Exit For
ElseIf Date.Today.Day = day
    If TimeOfDay.Hour <= hour Then
        TextBox1.Text = soderjimoevetki
        Exit For
    End If
End If


Вообще для это придумали тип DateTime
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: TimeOfDay.Hour сравнение

Сообщение Invader » 25.12.2011 (Вс) 11:22

переменные day, hour ,были у меня стринговые немного заменил код
Код: Выделить всё
  If Date.Today.Day <= CInt(day) Then
                    If TimeOfDay.Hour <= CInt(hour) Then

но всё равно ветку не находит
попробую через DateTime :roll:
умён и жаден,
характер отсуствует

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: TimeOfDay.Hour сравнение

Сообщение Invader » 25.12.2011 (Вс) 11:31

Код: Выделить всё
If DateTime.Now.Day <= CInt(day) Then
                    If DateTime.Now.Hour <= CInt(hour) Then

ничего не меняет, по прежнему
понимаю, что надо привести переменную CInt(hour) до и после полуночи, но как это сделать
умён и жаден,
характер отсуствует

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: TimeOfDay.Hour сравнение

Сообщение FireFenix » 25.12.2011 (Вс) 13:22

ничего не меняет, по прежнему

Может потому, что ты не использовал, то что я написал?

Код: Выделить всё
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer

        Dim Day As New List(Of String)
        Day.Add("25")
        Day.Add("25")
        Day.Add("26")
        Day.Add("27")

        Dim Hour As New List(Of String)
        Hour.Add("10")
        Hour.Add("11")
        Hour.Add("01")
        Hour.Add("15")

        Dim DayNow As Integer = Date.Today.Day
        Dim HourNow As Integer = TimeOfDay.Hour

        For i = 0 To Day.Count - 1
            If DayNow < Convert.ToInt32(Day(i)) Then
                Console.WriteLine("Selected = Day " & Day(i) & " | Hour " & Hour(i))
                Exit For
            ElseIf DayNow = Convert.ToInt32(Day(i)) Then
                If HourNow <= Convert.ToInt32(Hour(i)) Then
                    Console.WriteLine("Selected = Day " & Day(i) & " | Hour " & Hour(i))
                    Exit For
                End If
            End If
        Next

Выведет:
Код: Выделить всё
Selected = Day 26 | Hour 01
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: TimeOfDay.Hour сравнение

Сообщение Invader » 25.12.2011 (Вс) 13:51

ну из приведенного примера, ключевым я понимаю конструкцию начала условия
Код: Выделить всё
If Date.Today.Day < Convert.ToInt32(Day(i)) Then
                Console.WriteLine("Selected = Day " & Day(i) & " | Hour " & Hour(i))
                Exit For
            ElseIf Date.Today.Day= Convert.ToInt32(Day(i)) Then
                If TimeOfDay.Hour  <= Convert.ToInt32(Hour(i)) Then

ниже разве не тоже самое(по прежнему не работает)
Код: Выделить всё
If Date.Today.Day <= Convert.ToInt32(day) Then
                    If TimeOfDay.Hour <= Convert.ToInt32(hour) Then

и ещё вопрос,
почему такая арифметика работает
при текущем времени 21:30
и значении TextBox1.Text = 22:00
выдаёт 00:30
и не работает при значении TextBox1.Text = 02:00 тоесть не находит подтверждения 21:30 < 02:00

Код: Выделить всё
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f As DateTime = (TextBox1.Text.ToString)
        Dim s As DateTime = (DateTime.Now.Hour.ToString + ":00")
        If s <= f Then
            Label1.Text = (f - s).ToString
        End If
        'Label1.Text = f
    End Sub

в vb6 21:30 < 02:00 выражение верно
умён и жаден,
характер отсуствует

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: TimeOfDay.Hour сравнение

Сообщение FireFenix » 25.12.2011 (Вс) 14:34

Invader писал(а):ниже разве не тоже самое(по прежнему не работает)
Код: Выделить всё
If Date.Today.Day <= Convert.ToInt32(day) Then
                    If TimeOfDay.Hour <= Convert.ToInt32(hour) Then


Это же очевидно! Что при дне большем текущего - время сравнивать не нужно.
Но так же в твоём условии если день больше, то время только после текущего, что не врено

Invader писал(а):и ещё вопрос,
почему такая арифметика работает при текущем времени 21:30
и не работает при значении TextBox1.Text = 02:00

Эта "арифметика"?
Почему? Используй отладчик Люк!
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: TimeOfDay.Hour сравнение

Сообщение Invader » 25.12.2011 (Вс) 14:48

FireFenix писал(а):Используй отладчик Люк!

:oops: как его запустить, в смысле -где он?
умён и жаден,
характер отсуствует

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: TimeOfDay.Hour сравнение

Сообщение FireFenix » 25.12.2011 (Вс) 14:52

Invader писал(а):
FireFenix писал(а):Используй отладчик Люк!

:oops: как его запустить, в смысле -где он?

Слева кода есть некоторое место, тыкаешь мышкой, и вся строка выделяется красным цветом. (Или же через ПКМ выбрать Set Breakpoint)
запускаешь код и на этом месте останавливается во время выполнения.
на панели инструментов ещё можно потыкать на Step In/Step Out
если во время останова навести мышкой на переменную - высветится её значения
и ещё можно из контекстного меню найти Watch, Quick Watch и т.д.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: TimeOfDay.Hour сравнение

Сообщение Invader » 25.12.2011 (Вс) 15:09

про Breakpoint я слышал, не знал что это отладчик люк..
вот что интересное обнаружил оказывается
Код: Выделить всё
Dim f As DateTime = (TextBox1.Text.ToString + ":00")
        Dim s As DateTime = (DateTime.Now.Hour.ToString + ":00")
        If s <= f Then
            Label1.Text = (f - s).ToString 'точка останова
        End If
        Label1.Text = f.ToString
    End Sub

переменная f как и s имеют формат #hh: mm tt# хотя в Label1.Text вижу без AM/PM в нормальной 24 форме
умён и жаден,
характер отсуствует

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: TimeOfDay.Hour сравнение

Сообщение Invader » 25.12.2011 (Вс) 15:29

как привести значение для переменой, для дальнейших с ней операций к 24 часовому формату
Код: Выделить всё
Dim f As DateTime = (TextBox1.Text.ToString + ":00")

через TextBox1 передаю значение 02, и получаю f равное 2:00 АМ, а как же присвоить значение 02:00
пробовал TextBox1.Text.ToString("HH:mm") но выдаёт ошибку: Не удалось привести тип объекта "System.String" к типу "System.IFormatProvider".
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.12.2011 (Вс) 21:55

1. Многократное использование Date.Today при сравнении сожет приводить к неверному результату.
2. Использование Date.Today в цикле может приводить к неверному результату.
3. 2:00 АМ - это абсолютно то же самое, что и 02:00.
4. Надо проверять день меньше или (день равен и время меньше).
5. Мне лень разбираться в куче кода тут.
6. TextBox1.Text.ToString - зачем тут ToString? К тому же, это функция.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re:

Сообщение Invader » 26.12.2011 (Пн) 8:35

Qwertiy писал(а):3. 2:00 АМ - это абсолютно то же самое, что и 02:00.


оно ясно, только программа считает 21:00 больше чем02:00, что для меня (Лично!) ложно. В vb6 time и переменная variable с лёту определяла 21:00 меньше 02:00 в контексте даты, а в версии .НЕТ мне предлагается DateTime.Now.Hour -интежер и для этого значения конечно сравнивать 21 и 02, очевидно прога выдаст 21 > 02
так вот дорогая редакция, с уважением прислушиваясь к советам, и всё равно сделав по своему.
я пришел к выводу, что надо сравнивать не часы, а более полную дату и проблема устраняется. Вот мой вариант:
Код: Выделить всё
Dim h0 As Date
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        h0 = DateAndTime.Now
        Label1.Text = h0
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim t1 As Date = (Date.Now.Day.ToString + "." + Date.Now.Month.ToString + "." + Date.Now.Year.ToString + " " + TextBox1.Text + ":00")
        If DateTime.Compare(t1, h0) > 0 Then
            Label1.Text = "заданое время > now на " + (t1 - h0).ToString
        Else
            Label1.Text = "now > заданое время на " + (h0 - t1).ToString
        End If
    End Sub

добавлю, xml документ передает мне дни в порядке возрастания - сортировать не надо, и помимо дня, также передает месяц и год, но в примере выше я указал общий принцип, если в распоряжении есть только данные о часах
умён и жаден,
характер отсуствует

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: TimeOfDay.Hour сравнение

Сообщение iGrok » 26.12.2011 (Пн) 14:29

Invader писал(а):оно ясно, только программа считает 21:00 больше чем02:00, что для меня (Лично!) ложно.

Ну, значит привыкай, что твои "личные" ощущения не всегда совпадают с реальностью. И лучше переучивай личные ощущения, потому что реальность-то тебе всё равно не изменить.
В контексте суток, 02:00 меньше, чем 21:00.

Invader писал(а):В vb6 time и переменная variable с лёту определяла 21:00 меньше 02:00 в контексте даты

Не верю. vb6 под рукой нет, но в vba всё правильно - 02:00 меньше 21:00.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.12.2011 (Пн) 16:27

Invader писал(а):Dim t1 As Date = (Date.Now.Day.ToString + "." + Date.Now.Month.ToString + "." + Date.Now.Year.ToString + " " + TextBox1.Text + ":00")

Какого чёрта?!
1. А если кто-нибудь запустит эту программу в такой момент, когда поменяется месяц или год?
2. Date.Now.ToString("d.M.yyyy ") + TextBox1.Text + ":00", но это тоже не годится по пункту 3.
3. Такое формирование строки не может гарантировать верное декодирование при других региональных параметрах.
4. Есть гораздо более простой, быстрый и надёжный способ: Date.Today.AddHours(CInt(TextBox1.Text))!
5. В твоём случае вообще надо использовать h0.Date.AddHours(CInt(TextBox1.Text)), а не Date.Now или Date.Today, т. к. потом ты выводишь разницу с h0.

Invader писал(а):If DateTime.Compare(t1, h0) > 0 Then

Можно написать If t1 > h0 Then.

PS: VB.NET поддерживает &. Почему ты используешь +?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.12.2011 (Пн) 17:22

Ещё способ забыл: New Date(h0.Year, h0.Month, h0.Day, CInt(TextBox1.Text), 0, 0). Есть подозрение, что этот вариант самый подходящий в твоём случае.

Invader писал(а):добавлю, xml документ передает мне дни в порядке возрастания - сортировать не надо, и помимо дня, также передает месяц и год, но в примере выше я указал общий принцип, если в распоряжении есть только данные о часах

Вообще-то, xml для того и существует, чтобы можно было передавать данные в произвольном порядке, с целью возможности лёгкой модификации формата данных (без негативных последствий для использующей стороны). Как-то криво сформулировал, надеюсь, что понятно.

iGrok писал(а):
Invader писал(а):В vb6 time и переменная variable с лёту определяла 21:00 меньше 02:00 в контексте даты

Не верю. vb6 под рукой нет, но в vba всё правильно - 02:00 меньше 21:00.

Invader, я тоже не верю. Покажи код.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re:

Сообщение Invader » 27.12.2011 (Вт) 12:49

Qwertiy писал(а):PS: VB.NET поддерживает &. Почему ты используешь +?

по привычке, ближе под рукой 8)
Qwertiy писал(а):Invader, я тоже не верю. Покажи код.

в контексте даты -я имел виду что сравниваются не часы а полный формат: 25.06.2010 21:00 сравнивается с текущим,наступившим 26.06.2010 02:00 моментом
Qwertiy писал(а):Ещё способ забыл: New Date(h0.Year, h0.Month, h0.Day, CInt(TextBox1.Text), 0, 0). Есть подозрение, что этот вариант самый подходящий в твоём случае.

да максимально исчерпывающе

и кусок XML документа, возможно, до боли, многим знакомого:
<FORECAST day="27" month="12" year="2011" hour="14" tod="2" predict="0" weekday="3">
<PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/><PRESSURE max="759" min="757"/>
<TEMPERATURE max="11" min="9"/>
<WIND min="3" max="5" direction="6"/>
<RELWET max="72" min="70"/>
<HEAT min="8" max="10"/></FORECAST>

gismeteo.ru
условие вышло лаконичнее при сравнении полного формата даты и времени -одна строчка условия,
не жели проверка, как в моём первом случае: только часов -всё работало, пока не встречался час меньше, и с осмыслением этого, проверять отдельно дни и проверять ещё и часы
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.12.2011 (Вт) 14:51

Invader писал(а):в контексте даты -я имел виду что сравниваются не часы а полный формат: 25.06.2010 21:00 сравнивается с текущим,наступившим 26.06.2010 02:00 моментом

Ну так это и на VB.NET так же получится :D

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: TimeOfDay.Hour сравнение

Сообщение Invader » 28.12.2011 (Ср) 18:28

где тему закрыть и тыкнуть плюсик за старание и желание, мне помочь - неучу.
ссылки на webmany и космобаксы непредлогать 8)
умён и жаден,
характер отсуствует

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: TimeOfDay.Hour сравнение

Сообщение 1Steps » 02.01.2012 (Пн) 16:34

Invader писал(а):я пришел к выводу, что надо сравнивать не часы, а более полную дату и проблема устраняется.
:cheers:
Удалена за ненадобностью.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 84

    TopList