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

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
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
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 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. 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: 52Date: 12/29/03   Day: Mon   Week: 53Date: 12/30/03   Day: Tue   Week: 1Date: 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   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...					

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 IfEnd 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 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. 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 iEnd 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: 52Date: 12/29/03   Day: Mon   Week: 1Date: 12/30/03   Day: Tue   Week: 1Date: 12/31/03   Day: Wed   Week: 1					
    Lưu ý rằng thứ hai được coi là tuần 1 như nó nên.

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 200299 - Xem lại Lần cuối: 12/05/2015 10:27:27 - Bản sửa đổi: 2.0

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

  • kbnosurvey kbarchive kbbug kbdatetime kbpending kbmt KB200299 KbMtvi
Phản hồi