Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Quando determinar o número de semana de uma data de acordo com o 8601 ISO padrão, a chamada de função subjacente para o ficheiro Oleaut32.dll devolve por engano semana 53 em vez de semana 1 para a última Segunda-feira de alguns anos.
Utilizar uma função definida pelo utilizador para devolver o número de semana com base nas regras para a norma ISO 8601. Um exemplo é incluído neste artigo.
A norma ISO 8601 é utilizada extensivamente na Europa e incluir o seguinte:
ISO 8601 "Data elements and interchange formats - Information interchange - Representation of dates and times"
ISO 8601 : 1988 (E) paragraph 3.17:
"week, calendar: A seven day period within a calendar year, starting
on a Monday and identified by its ordinal number within the year;
the first calendar week of the year is the one that includes the
first Thursday of that year. In the Gregorian calendar, this is
equivalent to the week which includes 4 January."
Isto pode ser implementado aplicando estas regras para semanas de calendário:
Um ano é dividido em 53 ou 52 semanas de calendário.
Uma semana de calendário tem 7 dias. Segunda-feira é 1 dia, Domingo é dia 7.
Primeira semana de calendário do ano é aquele que contém menos de 4 dias.
Se um ano não é concluído uma Domingo, respectivos 1-3 últimos dias pertencem a primeira semana de calendário do ano seguinte ou de 1-3 dias do ano seguinte pertencem a última semana de calendário do presente ano.
Apenas um ano inicial ou concluindo uma Quinta-feira tem 53 semanas de calendário.
No Visual Basic e Visual Basic for Applications, todas as funcionalidade de data, excepto para a função SérieData , provêm de chamadas para o ficheiro Oleaut32.dll. Uma vez que as Formatar() e PartData() funções podem devolver o número de semana do calendário para uma determinada data, ambos são afectados por este erro. Para evitar este problema, tem de utilizar o código alternativo que este artigo fornece.
Inicie um projecto EXE padrão no Visual Basic. É criado o Form1 por predefinição.
Adicione dois CommandButtons ao Form1.
Cole o código seguinte na janela de código do Form1:
Option Explicit
Private Sub Command1_Click()
' This code tests a "problem" date and the days around it
Dim DateValue As Date
Dim i As Integer
Debug.Print " Format function:"
DateValue = #12/27/2003#
For i = 1 To 4 ' examine the last 4 days of the year
DateValue = DateAdd("d", 1, DateValue)
Debug.Print "Date: " & DateValue & " Day: " & _
Format(DateValue, "ddd") & " Week: " & _
Format(DateValue, "ww", vbMonday, vbFirstFourDays)
Next i
End Sub
Private Sub Command2_Click()
' This code lists all "Problem" dates within a specified range
Dim MyDate As Date
Dim Years As Long
Dim days As Long
Dim woy1 As Long
Dim woy2 As Long
Dim ToPrint As String
For Years = 1850 To 2050
For days = 0 To 3
MyDate = DateSerial(Years, 12, 28 + days)
woy1 = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
woy2 = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
If woy2 > 52 Then
If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then _
woy2 = 1
End If
If woy1 <> woy2 Then
ToPrint = MyDate & String(13 - Len(CStr(MyDate)), " ")
ToPrint = ToPrint & Format(MyDate, "dddd") & _
String(10 - Len(Format(MyDate, "dddd")), " ")
ToPrint = ToPrint & woy1 & String(5 - Len(CStr(woy1)), " ")
ToPrint = ToPrint & woy2
Debug.Print ToPrint
End If
Next days
Next Years
End Sub
Mantenha premida a tecla CTRL e prima a tecla de conta para abrir a janela Immediate.
Execute o projecto, clique no Command1 e tenha em atenção os seguintes resultados na janela Immediate:
Note que com este formato, todas as semanas começam segunda-feira, para que 29/12/2003 devem ser consideradas o início da semana 1 e não faz parte de semana 53.
Clique no Command2 para ver uma lista de datas no intervalo especificado que detectem este problema. A lista inclui a data, o dia de semana (sempre segunda) a semana # devolvido pelo formato (53) e o número de semana deverá devolver (1). Por exemplo:
Se utilizar as funções Formatar ou PartData , terá de verificar o valor de retorno e, quando é 53, executar outra verificação e forçar um retorno de 1, se necessário. Este exemplo de código demonstra uma forma de fazê-lo:
Function WOY (MyDate As Date) As Integer ' Week Of Year
WOY = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
If WOY > 52 Then
If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then WOY = 1
End If
End Function
, pode evitar utilizar estas funções para determinar o número de semana escrevendo código que implementa as regras de ISO 8601 descritas acima. O exemplo seguinte demonstra uma função de substituição para devolver o número de semana.
Inicie um projecto EXE padrão no Visual Basic. É criado o Form1 por predefinição.
No menu Project , adicione um módulo novo e cole-o no seguinte código:
Option Explicit
Function WeekNumber(InDate As Date) As Integer
Dim DayNo As Integer
Dim StartDays As Integer
Dim StopDays As Integer
Dim StartDay As Integer
Dim StopDay As Integer
Dim VNumber As Integer
Dim ThurFlag As Boolean
DayNo = Days(InDate)
StartDay = Weekday(DateSerial(Year(InDate), 1, 1)) - 1
StopDay = Weekday(DateSerial(Year(InDate), 12, 31)) - 1
' Number of days belonging to first calendar week
StartDays = 7 - (StartDay - 1)
' Number of days belonging to last calendar week
StopDays = 7 - (StopDay - 1)
' Test to see if the year will have 53 weeks or not
If StartDay = 4 Or StopDay = 4 Then ThurFlag = True Else ThurFlag = False
VNumber = (DayNo - StartDays - 4) / 7
' If first week has 4 or more days, it will be calendar week 1
' If first week has less than 4 days, it will belong to last year's
' last calendar week
If StartDays >= 4 Then
WeekNumber = Fix(VNumber) + 2
Else
WeekNumber = Fix(VNumber) + 1
End If
' Handle years whose last days will belong to coming year's first
' calendar week
If WeekNumber > 52 And ThurFlag = False Then WeekNumber = 1
' Handle years whose first days will belong to the last year's
' last calendar week
If WeekNumber = 0 Then
WeekNumber = WeekNumber(DateSerial(Year(InDate) - 1, 12, 31))
End If
End Function
Function Days(DayNo As Date) As Integer
Days = DayNo - DateSerial(Year(DayNo), 1, 0)
End Function
Adicione um CommandButton ao Form1.
Cole o código seguinte na janela de código do Form1:
Private Sub Command1_Click()
Dim DateValue As Date, i As Integer
Debug.Print " WeekNumber function:"
DateValue = #12/27/2003#
For i = 1 To 4 ' examine the last 4 days of the year
DateValue = DateAdd("d", 1, DateValue)
Debug.Print "Date: " & DateValue & " Day: " & _
Format(DateValue, "ddd") & " Week: " & WeekNumber(DateValue)
Next i
End Sub
Mantenha premida a tecla CTRL e prima a tecla de conta para abrir a janela Immediate.
Execute o projecto e clique no Command1 para ver os resultados seguintes na janela Immediate:
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 200299
(http://support.microsoft.com/kb/200299/en-us/
)
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
O que podemos fazer para melhor estas informações?
Para proteger a sua privacidade, não inclua as informações de contacto nos comentários.
Obrigado! Os seus comentários serão utilizados para nos ajudar a melhorar o conteúdo do suporte. Para obter mais opções de assistência, visite a Home Page da Ajuda e Suporte.