COMO SABER SE ESTAMOS NO HORARIO DE VERAO?

MAICONCARDOSO 10/12/2013 09:59:43
#431952
Olá pessoal!

Existe alguma maneira para sabermos se estamos no horário de verão sem que tenhamos que fazer várias analises de data por ano?
Tipo poderia ser feito vários [Ô]case[Ô] com as datas do horário de verão de 2013 até 2030 por exemplo... Mas queria saber se existe uma maneira mais [Ô]automatizada[Ô]...

grato!!!
OCELOT 10/12/2013 10:23:45
#431955
Não tenho nenhum código para isso, mas vou tentar dizer como funciona, o problema de se saber se está no horário de verão é saber o final dele.

O horário de verão começa sempre no terceiro domingo de outubro, o que deve ser fácil de calcular, o final dele é no terceiro domingo de fevereiro do ano seguinte, o que seria fácil de calcular se não fosse pela exceção de que se ele cair no mesmo domingo de carnaval então ele termina no quarto domingo de fevereiro.

Pode parecer simples, mas o carnaval é uma data móvel que ocorre 47 dias antes da páscoa. Parece simples ainda, só que o problema é que a páscoa ocorre no primeiro domingo após a primeira lua cheia a partir do equinócio de outono (para o hemisfério sul)

Pelo que vi o que é feito nos sistemas geralmente é pegar os anos em que a exceção ocorre e deixar isso fixo no programa, dai calcula-se apenas o inicio e no calculo do fim apenas calcula a data de acordo com a exceção pré programada, se for exceção usa o quarto domingo, se não usa o terceiro.
KERPLUNK 10/12/2013 10:26:28
#431956
Resposta escolhida

Private Const TIME_ZONE_ID_UNKNOWN As Long = 1
Private Const TIME_ZONE_ID_STANDARD As Long = 1
Private Const TIME_ZONE_ID_DAYLIGHT As Long = 2
Private Const TIME_ZONE_ID_INVALID As Long = &HFFFFFFFF

Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Private Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(0 To 63) As Byte [ô]Unicode
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(0 To 63) As Byte [ô]Unicode
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type

Private Declare Function GetTimeZoneInformation Lib [Ô]kernel32[Ô] _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long

Private Function IsDaylightSavingTime() As Boolean

Dim tzi As TIME_ZONE_INFORMATION

IsDaylightSavingTime = GetTimeZoneInformation(tzi) = TIME_ZONE_ID_DAYLIGHT

End Function

Private Sub Command1_Click()
MsgBox IIf(IsDaylightSavingTime(), [Ô]Sim[Ô], [Ô]não[Ô])

End Sub
MAICONCARDOSO 10/12/2013 16:08:41
#431976
Muito bom meus caros!!

A explicação científica e o código fonte foram muito úteis, agradeço o empenho dos colegas!!

Abraço!
Tópico encerrado , respostas não são mais permitidas