BUG: تنسيق أو دالات DatePart يمكن إرجاع رقم الأسبوع خاطئة يوم الاثنين الماضي في السنة

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية200299
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الأعراض
عند استخدام الدالة تنسيق أو DatePart لتحديد رقم أسبوع التواريخ باستخدام بناء الجملة التالي:
Format(AnyDate, "ww", vbMonday, vbFirstFourDays)DatePart("ww", AnyDate, vbMonday, vbFirstFourDays)				
تم إرجاع الاثنين الأخير في سنة التقويم بعض بالشكل عندما يجب أن يكون الأسبوع 1 الأسبوع 53.
السبب
عند تحديد رقم الأسبوع من التاريخ وفقاً 8601 ISO القياسية ، إرجاع استدعاء دالة الأساسي إلى الملف Oleaut32.dll عن طريق الخطأ الأسبوع 53 بدلاً من الأسبوع 1 يوم الاثنين الأخير في سنوات معينة.
الحل
استخدام دالة معرفة من قبل المستخدم لإرجاع رقم الأسبوع استناداً إلى القواعد القياسية 8601 ISO. يتم تضمين مثال في هذه المقالة.
تصريح
أقرت Microsoft أن هذه مشكلة في الملف Oleaut32.dll.
معلومات أخرى
يتم استخدامها بشكل مكثف في أوروبا القياسية 8601 ISO و يتضمن ما يلي:
  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-3 إلى أسبوع التقويم الأول السنة القادمة أو يوم 1-3 الأول من السنة التالية تنتمي إلى أسبوع التقويم الأخير السنة الحالية.
  • لدى فقط سنة بدء أو concluding على خميس أسابيع التقويم 53.
في Visual Basic أو Visual Basic for Applications تأتي كافة الوظائف تاريخ عدا الدالة DateSerial من الاستدعاءات إلى الملف Oleaut32.dll. لأنه يمكن Format() و DatePart() بإرجاع رقم الأسبوع التقويم لتاريخ معطى ، كليهما تتأثر هذا الخطأ. لتجنب هذه المشكلة، يجب عليك استخدام رمز بديل توفر هذه المقالة.

خطوات إعادة إنشاء السلوك

  1. بدء تشغيل مشروع EXE قياسي في Visual Basic. يتم إنشاء 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						
    الملاحظات التي بتنسيق هذا الأسابيع كافة بتشغيل مع الاثنين، بحيث ٢٩ ديسمبر 2003 يجب اعتبار بداية الأسبوع 1 و ليست جزءاً من 53 أسبوع.
  6. انقر فوق Command2 لمشاهدة قائمة تواريخ التي تواجه هذه المشكلة في النطاق المعيّن. تتضمن القائمة تاريخ ، يوم الأسبوع (دوماً الاثنين) ، الأسبوع تم إرجاعه بواسطة التنسيق (٥٣) و رقم الأسبوع يجب أن تعود # (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				
أنه يمكنك تجنب استخدام هذه الدالات لتحديد رقم أسبوع بواسطة كتابة التعليمات البرمجية التي تطبق قواعد 8601 ISO الموضحة أعلاه. يوضح المثال التالي دالة استبدال لإرجاع رقم الأسبوع.

مثال خطوة بخطوة

  1. بدء تشغيل مشروع EXE قياسي في Visual Basic. يتم إنشاء 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 الأسبوع كما يجب أن تكون.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 200299 - آخر مراجعة: 12/05/2015 10:27:17 - المراجعة: 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 KbMtar
تعليقات