DetailPage-MSS-KB

Knowledge Base

Artikel-ID: 200299 - Geändert am: Donnerstag, 24. Juni 2004 - Version: 3.0

 

Auf dieser Seite

Problembeschreibung

Wenn Sie die Format oder die DatePart -Funktion verwenden, um die Wochennummer für Datumsangaben mit Hilfe der folgenden Syntax zu bestimmen:
Format(AnyDate, "ww", vbMonday, vbFirstFourDays)

DatePart("ww", AnyDate, vbMonday, vbFirstFourDays)
				
des letzten Montag in einigen Jahren Kalender wird als Woche 53 Wenn es Woche 1 sein sollte zurückgegeben.

Ursache

Wenn Sie die Wochennummer ein Datum entsprechend dem standard ISO 8601 zu ermitteln, gibt der zugrunde liegenden Funktionsaufruf in die Datei "Oleaut32.dll" Woche 53 statt Woche 1 für den letzten Montag versehentlich in bestimmten Jahren.

Lösung

Verwenden Sie eine benutzerdefinierte Funktion, um die Woche Nummer anhand der Regeln für den Standard ISO 8601 zurückzugeben. Ein Beispiel ist in diesem Artikel enthalten.

Status

Microsoft hat bestätigt, dass dies ein Problem in der Datei "Oleaut32.dll" ist.

Weitere Informationen

Des ISO 8601-Standards in Europa ausgiebig verwendet wird und enthält die folgenden:
  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."
				
diese durch Anwenden dieser Regeln für Kalender Wochen implementiert werden kann:
  • Ein Jahr ist in 52 oder 53 Kalenderwochen unterteilt.
  • Eine Kalenderwoche hat 7 Tage. Montag ist Tag 1, Sonntag ist 7 Tage.
  • Die erste Kalender Woche eines Jahres ist mit mindestens 4 Tage.
  • Wenn ein Jahr nicht auf einen Sonntag abgeschlossen ist, dessen 1-3 Tagen zu erste Kalenderwoche des nächsten Jahres gehören, oder der ersten 1 bis 3 Tage des nächsten Jahres gehören das aktuelle Jahr Kalenderwoche.
  • Nur ein Jahr starten oder Abschließen einer Donnerstags hat 53 Kalenderwochen.
In Visual Basic und Visual Basic für Applikationen kommt alle Funktionen für Datum, außer für die DateSerial -Funktion von Aufrufe an die Datei "Oleaut32.dll". Da sowohl die Format() die DatePart() Funktionen die Kalender Wochenzahl für ein bestimmtes Datum zurückgeben können, sind beide diesem Fehler betroffen. Um dieses Problem zu vermeiden, müssen Sie den alternativen Code verwenden, den dieser Artikel enthält.

Schritte zum Reproduzieren des Verhaltens

  1. Starten Sie ein Standard-Projekt in Visual Basic. Form1 wird standardmäßig erstellt.
  2. Fügen Sie zwei Befehlsschaltflächen zu Form1 hinzu.
  3. Fügen Sie folgenden Code in das Codefenster von 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. Halten Sie die STRG-TASTE, und drücken Sie die G-TASTE, um das Direktfenster zu öffnen.
  5. Führen Sie das Projekt, klicken Sie auf Command1 und notieren Sie die folgenden Ergebnisse im Direktfenster:
       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
    						
    Hinweis mit diesem Format beginnen alle Wochen mit Montag, sodass 12/29/2003 Anfang der Woche 1 und nicht Teil der Woche 53 berücksichtigt werden sollen.
  6. Klicken Sie auf "Befehl2" um eine Liste von Datumsangaben im angegebenen Bereich zu sehen, die dieses Problem auftreten. Die Liste enthält das Datum, Woche Arbeitstag (immer), der Woche # zurückgegebener Format (53) und die Woche Zahl zurückgegeben werden soll (1). Zum Beispiel:
    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
    ...
    					

Problemumgehungen

Wenn Sie die Funktionen oder DatePart verwenden, müssen Sie den Rückgabewert überprüfen und 53, wird eine andere Überprüfung ausführen und erzwingen eine Rückgabe von 1, falls erforderlich. In diesem Codebeispiel wird eine Möglichkeit dazu veranschaulicht:
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
				
Sie können die Verwendung dieser Funktionen Woche Anzahl durch Schreiben von Code, die die oben beschriebenen ISO 8601-Regeln implementiert bestimmen vermieden. Das folgende Beispiel veranschaulicht eine Ersatz-Funktion zum Zurückgeben der Anzahl Woche.

Schritt für Schritt (Beispiel)

  1. Starten Sie ein Standard-Projekt in Visual Basic. Form1 wird standardmäßig erstellt.
  2. Im Menü Projekt ein neues Modul hinzufügen und dann in den folgenden Code einfügen:
    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. Fügen Sie eine Befehlsschaltfläche zu Form1 hinzu.
  4. Fügen Sie folgenden Code in das Codefenster von 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. Halten Sie die STRG-TASTE, und drücken Sie die G-TASTE, um das Direktfenster zu öffnen.
  6. Führen Sie das Projekt und auf Command1 die folgenden Ergebnisse im Direktfenster klicken Sie auf:
       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
    					
    Hinweis, dass Montag gilt Woche 1 wie er sein sollte.

Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbmt kbbug kbdatetime kbpending KB200299 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 200299  (http://support.microsoft.com/kb/200299/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Freigeben
Weitere Supportoptionen
Microsoft Community-Supportforen
Kontaktieren Sie uns direkt
Zertifizierten Partner finden
Microsoft Store
Folgen Sie uns: