L?I: Đ?nh d?ng ho?c ch?c năng DatePart th? tr? l?i sai tu?n s? cho cu?i th? hai trong năm

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 200299 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TRI?U CH?NG

Khi b?n s? d?ng ho?c các Định dạng ho?c DatePart ch?c năng đ? xác đ?nh s? tu?n cho ngày tháng b?ng cách s? d?ng cú pháp sau:
Format(AnyDate, "ww", vbMonday, vbFirstFourDays)

DatePart("ww", AnyDate, vbMonday, vbFirstFourDays)
				
cu?i th? hai trong m?t s? năm l?ch tr? l?i như tu?n 53 khi nó nên là trong tu?n 1.

NGUYÊN NHÂN

Khi xác đ?nh s? tu?n m?t ngày theo tiêu chu?n ISO 8601, các cu?c g?i ch?c năng ti?m ?n cho t?p tin Oleaut32.dll nh?m l?n tr? v? tu?n 53 thay v? c?a tu?n 1 cho cu?i th? hai trong m?t s? năm.

GI?I PHÁP

S? d?ng m?t ch?c năng ngư?i dùng đ?nh ngh?a đ? tr? v? s? tu?n d?a trên các quy t?c cho các tiêu chu?n ISO 8601. M?t ví d? đư?c bao g?m trong bài vi?t này.

T?NH TR?NG

Microsoft đ? xác nh?n r?ng đây là m?t v?n đ? trong t?p tin Oleaut32.dll.

THÔNG TIN THÊM

Các tiêu chu?n ISO 8601 đư?c s? d?ng r?ng r?i ? châu Âu và bao g?m:
  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."
				
Đi?u này có th? đư?c th?c hi?n b?ng cách áp d?ng nh?ng quy t?c này cho l?ch tu?n:
  • M?t năm đư?c chia thành 52 ho?c 53 tu?n l?ch.
  • M?t tu?n l?ch có 7 ngày. Th? hai ngày 1, ch? nh?t là 7 ngày.
  • Tu?n l?ch đ?u tiên c?a m?t năm là m?t trong có ch?a ít nh?t 4 ngày.
  • N?u m?t năm không ph?i k?t thúc vào ngày Ch? Nh?t, ngày c?a nó 1-3 cu?i cùng thu?c v? năm t?i đ?u tiên l?ch tu?n ho?c 1-3 ngày đ?u tiên c?a năm t?i thu?c v? c?a năm nay l?ch tu?n trư?c.
  • Ch? là m?t năm b?t đ?u ho?c k?t lu?n ngày th? năm có 53 l?ch tu?n.
Trong Visual Basic và Visual Basic cho các ?ng d?ng, t?t c? các ngày ch?c năng, ngo?i tr? các DateSerial ch?c năng, đ?n t? các cu?c g?i đ?n t?p tin Oleaut32.dll. B?i v? c? hai các Format()DatePart() ch?c năng có th? tr? l?i l?ch tu?n s? cho m?t ngày nh?t đ?nh, c? hai đang b? ?nh hư?ng b?i l?i này. Đ? tránh v?n đ? này, b?n ph?i s? d?ng m? thay th? bài vi?t này cung c?p.

Các bư?c đ? t?o l?i hành vi

  1. B?t đ?u m?t d? án tiêu chu?n EXE trong Visual Basic. Form1 đư?c t?o ra theo m?c đ?nh.
  2. Thêm hai CommandButtons đ? Form1.
  3. Dán đo?n m? sau vào c?a s? m? c?a 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. Gi? phím CTRL và ?n phím g đ? m? c?a s? ngay l?p t?c.
  5. Ch?y các d? án, h?y nh?p vào Command1, và lưu ? các k?t qu? sau trong c?a s? ngay l?p t?c:
       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
    						
    Lưu ? r?ng v?i đ?nh d?ng này, t?t c? các tu?n b?t đ?u v?i th? hai, đ? 12/29/2003 c?n đư?c xem xét s? b?t đ?u c?a tu?n 1 và không ph?i là m?t ph?n c?a tu?n 53.
  6. Nh?p vào Command2 đ? xem danh sách các ngày trong d?y núi đ? ch? ra r?ng kinh nghi?m v?n đ? này. Danh sách bao g?m ngày, tu?n ngày (luôn luôn th? hai), tu?n # tr? l?i b?ng đ?nh d?ng (53), và m?t s? tu?n nó nên tr? v? (1.) Ví dụ:
    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
    ...
    					

Cách gi?i quy?t

N?u b?n s? d?ng các Định dạng ho?c DatePart ch?c năng, b?n c?n ki?m tra giá tr? tr? l?i và, khi nó là 53, ch?y m?t ki?m tra và ép bu?c m?t tr? l?i c?a 1, n?u c?n thi?t. M?u m? này ch?ng t? m?t cách đ? làm đi?u này:
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
				
B?n có th? tránh b?ng cách s? d?ng các ch?c năng này đ? xác đ?nh s? lư?ng tu?n b?ng cách vi?t m? mà th?c hi?n các quy t?c ISO 8601 mô t? ? trên. Ví d? sau đây ch?ng t? m?t ch?c năng thay th? đ? tr? v? s? tu?n.

Ví d? t?ng bư?c

  1. B?t đ?u m?t d? án tiêu chu?n EXE trong Visual Basic. Form1 đư?c t?o ra theo m?c đ?nh.
  2. T? các Dự án Menu, thêm m?t mô-đun m?i và sau đó dán vào m? sau đây:
    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. Thêm m?t CommandButton đ? Form1.
  4. Dán đo?n m? sau vào c?a s? m? c?a 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. Gi? phím CTRL và ?n phím g đ? m? c?a s? ngay l?p t?c.
  6. Ch?y các d? án và nh?p vào Command1 đ? xem các k?t qu? sau trong c?a s? ngay l?p t?c:
       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
    					
    Lưu ? r?ng th? hai đư?c coi là tu?n 1 như nó nên.

Thu?c tính

ID c?a bài: 200299 - L?n xem xét sau cùng: 20 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 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
T? khóa: 
kbbug kbdatetime kbpending kbmt KB200299 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:200299

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com