Время, дату, день недели очень легко выяснить, посмотрев в правый нижний угол рабочего стола Windows. Однако, если, например, вы читаете новости, которые поступают в реальном времени, где время публикаций указывают по Гринвичу (GMT) — это могут быть, например, новости валютного рынка или фондового рынка Форекс или другой экономический календарь, то в этом случае важно знать, насколько актуальна, свежа новость. Конечно, можно держать в голове, что время Москвы отличается от времени по Гринвичу на 4 часа, а время по Киеву — на 3 часа, а затем мучительно соображать, необходимо прибавить эти 3 часа к киевскому времени или наоборот отнять.

Кроме того, следует помнить, что время по Гринвичу не переводится на летние и зимние часы. Поэтому, чтобы выяснить правильное время по Гринвичу, можно на стандартном рабочем столе Windows справа внизу двойным щелчком на отображении текущего местного времени на вкладке Часовой пояс выбрать Время по Гринвичу и сбросить флажок Автоматический переход на летнее время и обратно. При этом очень удобно для сравнения времени иметь перед глазами специализированные сайты, где показано текущее местное время, среднеевропейское (или центральноевропейское время, Central European Time (СЕТ)) и время по Гринвичу.

Программа по отображению времени по Гринвичу

Предлагаю написать маленькую программу, которая в полупрозрачной экранной форме отображает текущее время по Гринвичу. То есть мы напишем программу, которая будет демонстрировать текущее время по Гринвичу и при этом, в силу своей прозрачности, не будет заслонять другие приложения.

Для решения этой задачи создадим форму и перетащим в нее из панели элементов управления Toolbox метку Label и объект Timer. Этот объект позволит обрабатывать событие Timer1.Tick через периодически заданные интервалы времени. Далее на вкладке визуального проекта программы Form1.vb (Design) растянем мышью форму и метку.

Время по Гринвичу в полупрозрачной форме

[code]‘ Программа в полупрозрачной экранной форме отображает текущее время
‘ по Гринвичу. Таким образом мы написали программу, которая
‘ демонстрирует текущее время по Гринвичу и при этом, в силу своей
‘ прозрачности, не заслоняет собой другие приложения.
Imports System.DateTime
PublicClass Form1
Dim t AsBoolean = False
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "ВРЕМЯ ПО ГРИНВИЧУ:"
Me.Opacity = 0.75 ‘ — уровень непрозрачности формы
Label1.Font =New Drawing.Font("Courier New", 18.0!)
Label1.TextAlign =ContentAlignment.MiddleCenter
Label1.Text =""
Timer1.Interval = 1000 ‘ 1000 милисекунд = 1 сек
Timer1.Start()
End Sub

Private Sub Timer1_Tick(ByVal senderAs Object,ByVal e As System.EventArgs) Handles Timer1.Tick
‘ Обработка события, когда прошел заданный интервал
‘ времени = 1000 милисекунд = 1 сек.
Label1.Text ="ВРЕМЯ ПО ГРИНВИЧУ: "
Dim время As String
t =Not t ‘ — то же, что и t = True Xor t
If t = TrueThen время = Format(UtcNow,"HH:mm") Else время = Format(UtcNow, "HH mm")
Label1.Text = Label1.Text & время
End Sub
Private Sub Form1_MouseLeave(ByVal senderAs Object,ByVal e As System.EventArgs) Handles MyBase.MouseLeave
Me.Opacity = 0.75
End Sub

Private Sub Label1_MouseEnter(ByVal senderAs Object,ByVal e As System.EventArgs) Handles Label1.MouseEnter
‘ При вхождении в границы метки:
Me.Opacity = 1
End Sub
EndClass[/code]

Здесь при обработке события загрузки формы Form1_ Load задаем текст «ВРЕМЯ ПО ГРИНВИЧУ:» в заголовке формы (свойство Me.Text), указываем уровень непрозрачности формы Me.Opacity = 0.75. Если Opacity = 0, то изображение формы совсем пропадает, программа будет благополучно работать в оперативной памяти, и мы будем догадываться о ее работе, т. к. она будет напоминать о своем существовании в свернутом виде в панели задач. При Opacity = 1 будем иметь обычное непрозрачное изображение формы. Замечу, что в VB6 у экранной формы не было такого свойства, и чтобы программировать прозрачность формы, приходилось использовать функции Microsoft Windows API.

Далее включаем таймер Timer1.Start() и задаем интервал работы таймера Timer1.Interval = 1000 (1000 миллисекунд, т. е. 1 с). Это означает, что через каждую секунду мы имеем возможность обрабатывать событие «прошла одна секунда» Timer1.Tick.

Справиться с задачей демонстрации времени было бы очень легко, если бы нам надо было просто отображать текущее время. Мы бы написали:

[code]Dim время As String: время = Format (Now, "hh:mm")
если мы хотим иметь время AM (например, 4:32), и
время = Format (Now, ",HH:mm"),
если мы хотим время РМ (т. е. 16:32).[/code]

Однако по условию задачи, нам нужно показывать время по Гринвичу. Система VB2010 имеет свойство UtcNow пространства имен System.DateTime. Это свойство возвращает так называемое универсальное координированное время (Universal Coordinated Time, UTC), которое с точностью до долей секунды совпадает со временем по Гринвичу. Поэтому выражение

[code]Время = Format (UtcNow, "HH:mm")[/code]

копирует в строку время значение текущего времени Гринвичского меридиана.

Далее, чтобы подчеркнуть, что время идет, между значением часа и значением минут зададим двоеточие (:), которое появляется в течение одной секунды и исчезает тоже на одну секунду. Для этого у нас есть внешняя булева переменная t, которая периодически меняет свое значение с True на False, потом с False на True и т. д., т. е. на противоположное: t = Not t. Таким образом, при обработке события Tick (события, когда прошел заданный интервал времени Interval, равный 1000 миллисекунд = 1 С) объекта Timer1 в метку Label1 копируется новое значение времени то с двоеточием, то без него.

Как видно, в тексте данной программы мы использовали переменные с русскими именами, что добавило выразительности программному коду. Мы реализовали возможность становиться форме непрозрачной при наведении курсора мыши В область метки при обработке события Label1_MouseEnter вхождения курсора мыши в границы метки. Из соображений эстетики (что, конечно же, может быть подвергнуто сомнению) мы запрограммировали возврат опять к прозрачной форме при выходе курсора мыши за пределы формы, а не метки, т. е. при наступлении события Form1_МouseLeave.