DetailPage-MSS-KB

기술 자료

기술 자료: 200299 - 마지막 검토: 2004년 6월 24일 목요일 - 수정: 3.0

 

이 페이지에서

현상

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

해결 방법

형식 또는 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 If
End Function
				
위에서 설명한 ISO 8601 규칙을 구현하는 코드를 작성하여 주 번호를 확인하려면 이러한 함수를 사용하여 피할 수 있습니다. 다음 예제에서는 주 번호를 반환하려면 대체 함수를 보여 줍니다.

단계별 지침 예제

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

본 문서의 정보는 다음의 제품에 적용됩니다.
  • 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
키워드: 
kbmt kbbug kbdatetime kbpending KB200299 KbMtko
기계 번역된 문서기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store
소기업이 아닙니까?
다음에서 팔로우하십시오.