BUG: 형식 또는 DatePart 함수가 잘못된 주 번호 연도 마지막 월요일에 반환 가능

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

200299
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
현상
형식 또는 DatePart 함수를 사용하여 다음 구문을 사용하여 날짜를 주 번호를 확인하는:
Format(AnyDate, "ww", vbMonday, vbFirstFourDays)DatePart("ww", AnyDate, vbMonday, vbFirstFourDays)				
일부 달력 연도 마지막 월요일 제1주 되어야 합니다 주 53으로 반환됩니다.
원인
표준 ISO 8601 따라 날짜 주 수를 결정할 때 Oleaut32.dll 파일 내부 함수 호출을 특정 연도의 마지막 월요일 일주일에 1 대신 주 53 실수로 반환합니다.
해결 방법
사용자 정의 함수를 ISO 8601 표준을 규칙에 따라 주 번호를 반환할 수 있습니다. 예를 들어가, 이 문서에 포함되어 있습니다.
현재 상태
Microsoft는 Oleaut32.dll 파일에 문제가 있음을 확인했습니다.
추가 정보
ISO 8601 표준을 유럽에서 널리 사용되는 및 다음을 포함합니다:
  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."				
이 일정 주 동안 이러한 규칙을 적용하여 구현할 수 있습니다.
  • 연간 52 또는 53 달력의 주는 나뉩니다.
  • 달력 주 7일 있습니다. 월 1 일, 7 일 일요일 설정됩니다.
  • 연간 달력의 주를 4일 이상 들어 있습니다.
  • 1년, 일요일에 마무리했습니다. 경우 해당 1-3 마지막 일 다음 연도의 첫째 달력의 주 속한 또는 현재 연도의 마지막 달력의 주 다음 연도의 첫 번째 1-3 일 속한.
  • 53 달력의 주 시작 또는 끝에 있는 목요일에 연간 하나만 있습니다.
Visual Basic 및 VBA Oleaut32.dll 파일 호출 에서 DateSerial 함수 제외한 모든 날짜 기능이 제공됩니다. 둘 다 Format()DatePart() 함수가 주어진된 날짜의 달력 주 번호를 반환할 수 있으므로 이 버그의 영향을 받지는지 않습니다. 이 문제를 방지하려면 이 문서에서 제공하는 대체 코드를 사용해야 합니다.

문제를 재현하기 위한 단계

  1. Visual Basic에서 표준 EXE 프로젝트를 시작하십시오. 기본적으로 Form1이 만들어집니다.
  2. CommandButtons Form1에 추가하십시오.
  3. 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. Ctrl 키를 누른 상태에서 G 키를 직접 실행 창을 엽니다.
  5. 프로젝트를 실행하고 Command1 클릭하여 직접 실행 창에 다음 결과가 참고:
       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						
    이 형식을 사용하여 월요일, 모든 주 시작 주 1 및 주 53 일부가 아닌 시작 03-12-29 고려해야 하는 것을 유의하십시오.
  6. 이 문제가 발생할 경우 지정한 범위에서 날짜 목록을 보려면 Command2 를 클릭하십시오. 목록에는 날짜, 주 일 (항상 월요일) 에서 주 (53), 서식 및 주 번호를 반환 합니다 반환된 # (1) 예를 들어,:
    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...					

해결 방법

형식 또는 DatePart 함수를 사용하여 53, 있을 때 다른 검사 실행 및 1, 반환 강제로 반환 값을 확인하고 필요한 경우 합니다. 이렇게 하는 한 가지 방법은 이 코드 샘플은:
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				
위에서 설명한 ISO 8601 규칙을 구현하는 코드를 작성하여 주 번호를 확인하려면 이러한 함수를 사용하여 피할 수 있습니다. 다음 예제에서는 주 번호를 반환하려면 대체 함수를 보여 줍니다.

단계별 지침 예제

  1. Visual Basic에서 표준 EXE 프로젝트를 시작하십시오. 기본적으로 Form1이 만들어집니다.
  2. 프로젝트 메뉴에서 새 모듈을 추가하고 다음 코드를 붙여:
    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. CommandButton Form1에 추가하십시오.
  4. 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. Ctrl 키를 누른 상태에서 G 키를 직접 실행 창을 엽니다.
  6. 프로젝트를 실행하고 직접 실행 창에 다음 결과를 보려면 Command1 클릭하십시오:
       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					
    노트 해당 월요일 것으로 주 1 수 있어야 합니다.

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 200299 - 마지막 검토: 12/05/2015 10:27:23 - 수정: 3.0

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

  • kbnosurvey kbarchive kbmt kbbug kbdatetime kbpending KB200299 KbMtko
피드백