BUG: Çü½Ä ¶Ç´Â DatePart ÇÔ¼ö°¡ À߸øµÈ ÁÖ ¹øÈ£ ¿¬µµ ¸¶Áö¸· ¿ù¿äÀÏ¿¡ ¹Ýȯ °¡´É

±â¼ú ÀÚ·á: 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 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 ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù.

¼Ó¼º

±â¼ú ÀÚ·á: 200299 - ¸¶Áö¸· °ËÅä: 2004³â 6¿ù 24ÀÏ ¸ñ¿äÀÏ - ¼öÁ¤: 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
Ű¿öµå:?
kbmt kbbug kbdatetime kbpending KB200299 KbMtko
±â°è ¹ø¿ªµÈ ¹®¼­
Áß¿ä: º» ¹®¼­´Â Àü¹® ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ °ÍÀÌ ¾Æ´Ï¶ó Microsoft ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î·Î ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù. Microsoft´Â ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ ¹®¼­ ¹× ±â°è ¹ø¿ªµÈ ¹®¼­¸¦ ¸ðµÎ Á¦°øÇϹǷΠMicrosoft ±â¼ú ÀÚ·á¿¡ ÀÖ´Â ¸ðµç ¹®¼­¸¦ Çѱ۷ΠÁ¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ±â°è ¹ø¿ª ¹®¼­°¡ Ç×»ó ¿Ïº®ÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. µû¶ó¼­ ±â°è ¹ø¿ª ¹®¼­¿¡´Â ¸¶Ä¡ ¿Ü±¹ÀÎÀÌ Çѱ¹¾î·Î ¸»ÇÒ ¶§ ½Ç¼ö¸¦ ÇÏ´Â °Íó·³ ¾îÈÖ, ±¸¹® ¶Ç´Â ¹®¹ý¿¡ ¿À·ù°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. Microsoft´Â ³»¿ë»óÀÇ ¿À¿ª ¶Ç´Â Microsoft °í°´ÀÌ ÀÌ·¯ÇÑ ¿À¿ªÀ» »ç¿ëÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â ºÎ Á¤È®¼º, ¿À·ù ¶Ç´Â ¼ÕÇØ¿¡ ´ëÇØ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. Microsoft´Â ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÚÁÖ ¾÷µ¥ÀÌÆ®Çϰí ÀÖ½À´Ï´Ù.

Çǵå¹é º¸³»±â