BUG: Format o funzioni DatePart sono reso numero settimana errato per ultimo lunedý nell'anno

Traduzione articoli Traduzione articoli
Identificativo articolo: 200299 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando si utilizza il formato o DatePart funzione per determinare il numero della settimana per le date utilizzando la seguente sintassi:
Format(AnyDate, "ww", vbMonday, vbFirstFourDays)

DatePart("ww", AnyDate, vbMonday, vbFirstFourDays)
				
il lunedý scorso in alcuni anni di calendario viene restituito come settimana 53 quando deve essere 1 settimana.

Cause

Quando si determina il numero di settimana di una data in base al standard ISO 8601, la chiamata di funzione sottostante il file Oleaut32.dll restituisce erroneamente settimana 53 invece del settimana per il lunedý scorso in determinati anni.

Risoluzione

Utilizzare una funzione definita dall'utente per restituire il numero di settimana in base alle regole per lo standard ISO 8601. Un esempio Ŕ incluso in questo articolo.

Status

Microsoft ha confermato che questo problema riguarda il file Oleaut32.dll.

Informazioni

Lo standard ISO 8601 viene utilizzato ampiamente Europa e include quanto segue:
  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."
				
Ŕ possibile implementare applicando le regole per settimane di calendario:
  • Un anno Ŕ suddiviso in 53 o 52 settimane del calendario.
  • Una settimana di calendario ha 7 giorni. Lunedý Ŕ il giorno 1, domenica Ŕ 7 giorni.
  • La prima settimana di un anno di calendario Ŕ quello contenente almeno 4 giorni.
  • Se un anno non viene conclusa una domenica, i giorni di 1-3 appartengono a prima settimana di calendario dell'anno successivo oppure i primi giorni 1-3 dell'anno prossimo appartengono a ultima settimana di calendario dell'anno corrente.
  • Solo un anno, avvio o di giungere alla conclusione di giovedý Ŕ 53 settimane del calendario.
In Visual Basic e Visual Basic, Applications Edition, tutte le funzionalitÓ data, fatta eccezione per la funzione DateSerial si provengono da chiamate per il file Oleaut32.dll. PoichÚ le Format() restituisce DatePart() funzioni e possono restituire il numero di settimana di calendario per una determinata data, entrambi sono interessati da questo errore. Per evitare questo problema, Ŕ necessario utilizzare il codice alternativo che in questo articolo vengono fornite.

Procedura per riprodurre il problema

  1. Avviare un progetto EXE standard in Visual Basic. In base all'impostazione predefinita, viene creato il progetto Form1.
  2. Aggiungere due CommandButtons a Form1.
  3. Incollare il codice seguente nella finestra del codice di 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
    					
  4. Tenere premuto il tasto CTRL e premere il tasto G per aprire la finestra immediata.
  5. Eseguire il progetto, fare clic su Command1 e notare i seguenti risultati nella finestra controllo immediato:
       Format function:
    Date: 12/28/03   Day: Sun   Week: 52
    Date: 12/29/03   Day: Mon   Week: 53
    Date: 12/30/03   Day: Tue   Week: 1
    Date: 12/31/03   Day: Wed   Week: 1
    						
    si noti che con questo formato, tutte le settimane avvia con lunedý, in modo che il 29/12/2003 deve essere considerato l'inizio della settimana 1 e non una parte della settimana 53.
  6. Fare clic su Command2 per visualizzare un elenco di date nell'intervallo specificato che il problema persiste. L'elenco include la data, settimana giorno (sempre lunedý), la settimana # restituiti da formato (53) e deve restituire il numero di settimana (1). Ad esempio:
    12/29/1851   Monday    53   1
    12/31/1855   Monday    53   1
    12/30/1867   Monday    53   1
    12/29/1879   Monday    53   1
    12/31/1883   Monday    53   1
    12/30/1895   Monday    53   1
    ...
    					

Soluzioni alternative

Se si utilizzano le funzioni o DatePart , Ŕ necessario controllare il valore restituito e, in quando Ŕ 53, eseguire un altro controllo e imporre un ritorno di 1, se necessario. Nel codice di esempio riportato di seguito viene illustrato un modo per effettuare questa operazione:
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
				
Ŕ possibile evitare di utilizzare queste funzioni per determinare il numero di settimana scrivendo codice che implementa le regole ISO 8601 descritte in precedenza. Nell'esempio riportato di seguito viene illustrato una funzione di sostituzione per restituire il numero di settimana.

Esempio di Step by Step

  1. Avviare un progetto EXE standard in Visual Basic. In base all'impostazione predefinita, viene creato il progetto Form1.
  2. Dal menu progetto , aggiungere un nuovo modulo e quindi incollare nel codice seguente:
    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
    					
  3. Aggiungere un pulsante di comando a Form1.
  4. Incollare il codice seguente nella finestra del codice di 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
    					
  5. Tenere premuto il tasto CTRL e premere il tasto G per aprire la finestra immediata.
  6. Esegue il progetto e fare clic su Command1 per visualizzare i seguenti risultati nella finestra controllo immediato:
       WeekNumber function:
    Date: 12/28/03   Day: Sun   Week: 52
    Date: 12/29/03   Day: Mon   Week: 1
    Date: 12/30/03   Day: Tue   Week: 1
    Date: 12/31/03   Day: Wed   Week: 1
    					
    nota che lunedý Ŕ considerato Week 1 come dovrebbe essere.

ProprietÓ

Identificativo articolo: 200299 - Ultima modifica: giovedý 24 giugno 2004 - Revisione: 3.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic for Applications 6.0
Chiavi:á
kbmt kbbug kbdatetime kbpending KB200299 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 200299
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com