Chyba: Formát alebo DatePart funkcie môžu vrátiť nesprávne číslo týždňa pre posledný pondelok v roku

DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.

Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:200299
Tento článok bol archivovaný. Je publikovaný v aktuálnej podobe a už nebude aktualizovaný.
PRIZNAKY
Keď použijete buď Formátovanie alebo DatePart Funkcia určiť číslo týždňa pre dátumy pomocou nasledujúcej syntaxe:
Format(AnyDate, "ww", vbMonday, vbFirstFourDays)DatePart("ww", AnyDate, vbMonday, vbFirstFourDays)				
Posledná pondelok v niektorých kalendárnych rokoch sa vráti ako týždeň 53, keď by mal byť 1 týždeň.
PRICINA
Pri určovaní čísla týždňa dátum podľa štandardu ISO 8601 podkladových volanie funkcie na súbor Oleaut32.dll omylom vráti týždeň 53 namiesto týždňa 1 pre posledný pondelok v niektorých rokoch.
RIESENIE
Použiť používateľský funkciu vrátiť číslo týždňa na základe pravidiel pre normu ISO 8601. Príkladom je zahrnuté v tomto článku.
STAV
Spoločnosť Microsoft potvrdila, že ide o problém v súbore Oleaut32.dll.
DALSIE INFORMACIE
Norma ISO 8601 používa extenzívne v Európe a zahŕňa nasledujúce:
  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."				
Môže sa to realizovať uplatnením týchto pravidiel pre kalendárne týždne:
  • Ročne je rozdelený do 52 alebo 53 kalendárne týždne.
  • Kalendárny týždeň má 7 dní. Pondelok je deň 1, nedeľa je deň 7.
  • Prvý kalendárny týždeň roka je obsahujúce najmenej 4 dni.
  • Ak ročne nie uzatvára na nedeľu, buď jej 1-3 posledné dni patria do budúceho roka prvý kalendárny týždeň alebo prvých 1-3 dní budúci rok patria do súčasný rok minulý kalendárny týždeň.
  • Len rok začatia alebo uzatváraní vo štvrtok má 53 kalendárne týždne.
V jazyku Visual Basic a Visual Basic for Applications, všetky dátum funkčnosť, s výnimkou DateSerial Funkcia, pochádza z volania na súbor Oleaut32.dll. Pretože aj Format() a DatePart() funkcie môžu vrátiť číslo týždňa kalendár pre určitého dátumu, obe sú ovplyvnené tejto chyby. Chcete vyhnúť tomuto problému, musíte použiť alternatívne kód, ktorý ustanovuje tento článok.

Kroky na reprodukovanie správanie

  1. Začať štandardné EXE projekt v jazyku Visual Basic. Form1 sa vytvorí na základe predvoleného nastavenia.
  2. Pridajte dva CommandButtons na Form1.
  3. Prilepte nasledujúci kód do okna pre kód z Form1:
    Option ExplicitPrivate Sub Command1_Click()' This code tests a "problem" date and the days around itDim DateValue As DateDim i As IntegerDebug.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 iEnd SubPrivate 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 YearsEnd Sub					
  4. Podržte stlačený kláves CTRL a kláves g na otvorenie okna Immediate.
  5. Spustenie projektu, kliknite na Command1, a Všimnite si tieto výsledky v okamžitom okne:
       Format function:Date: 12/28/03   Day: Sun   Week: 52Date: 12/29/03   Day: Mon   Week: 53Date: 12/30/03   Day: Tue   Week: 1Date: 12/31/03   Day: Wed   Week: 1						
    Upozorňujeme, že tento formát, všetky týždne začať s pondelok, takže 12, 29 a 2003 mali považovať za začiatok 1 týždeň a nie sú súčasťou týždni 53.
  6. Kliknite na Command2 Ak chcete zobraziť zoznam dátumov v danom rozsahu skúsenosti tento problém. Zoznam obsahuje dňa, týždňa deň (vždy pondelok), v týždni # vráti formát (53) a číslo týždňa, by sa mali vrátiť (1.) Napríklad:
    12/29/1851   Monday    53   112/31/1855   Monday    53   112/30/1867   Monday    53   112/29/1879   Monday    53   112/31/1883   Monday    53   112/30/1895   Monday    53   1...					

Možné riešenia

Ak používate Formátovanie alebo DatePart funkcie, budete musieť skontrolovať návratovej hodnoty a keď je to 53, plynúť ďalšia kontrola a účinnosti návrat 1, ak je to potrebné. Táto vzorka kódu ukazuje jeden spôsob, ako to urobiť:
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 IfEnd Function				
Môžete zabrániť pomocou týchto funkcií určiť číslo týždňa písania kódu, ktorý implementuje ISO 8601 pravidlami, uvedenými vyššie. Následujúci príklad demonštruje náhradné funkcia vrátiť číslo týždňa.

Príklad krok za krokom

  1. Začať štandardné EXE projekt v jazyku Visual Basic. Form1 sa vytvorí na základe predvoleného nastavenia.
  2. Z Project v ponuke pridať nový modul a potom prilepte nasledujúci kód:
    Option ExplicitFunction 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 IfEnd FunctionFunction Days(DayNo As Date) As Integer  Days = DayNo - DateSerial(Year(DayNo), 1, 0)End Function					
  3. Pridať CommandButton na Form1.
  4. Prilepte nasledujúci kód do okna pre kód z 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 iEnd Sub					
  5. Podržte stlačený kláves CTRL a kláves g na otvorenie okna Immediate.
  6. Spustenie projektu a kliknite na Command1 Ak chcete zobraziť tieto výsledky v okamžitom okne:
       WeekNumber function:Date: 12/28/03   Day: Sun   Week: 52Date: 12/29/03   Day: Mon   Week: 1Date: 12/30/03   Day: Tue   Week: 1Date: 12/31/03   Day: Wed   Week: 1					
    Všimnite si, že pondelok sa považuje za 1 týždeň ako má byť.

Upozornenie: Tento článok bol preložený automaticky.

Vlastnosti

ID článku: 200299 – Posledná kontrola: 12/05/2015 10:27:25 – Revízia: 2.0

Microsoft Visual Basic 6.0 Professional Edition, 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 for Applications 6.0

  • kbnosurvey kbarchive kbbug kbdatetime kbpending kbmt KB200299 KbMtsk
Pripomienky