Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Ketika menentukan angka minggu dari tanggal yang sesuai dengan standar ISO 8601, panggilan fungsi dasar untuk berkas Oleaut32.dll keliru kembali minggu 53 bukannya Minggu 1 untuk hari Senin terakhir dalam tahun tertentu.
Menggunakan fungsi ditetapkan pengguna untuk mengembalikan angka minggu yang didasarkan pada aturan-aturan untuk standar ISO 8601. Contoh termasuk dalam artikel ini.
Standar ISO 8601 digunakan secara luas di Eropa dan meliputi:
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."
Ini dapat dilaksanakan dengan menerapkan aturan-aturan ini kalender minggu:
Satu tahun dibagi menjadi 52 atau 53 minggu kalender.
Minggu kalender memiliki 7 hari. Senin adalah hari 1, Minggu adalah hari 7.
Kalender minggu pertama tahun adalah salah satu yang berisi sekurang-kurangnya 4 hari.
Jika satu tahun tidak menyimpulkan pada hari Minggu, 1-3 hari-hari terakhir milik minggu kalender pertama tahun depan atau 1-3 hari pertama tahun depan milik tahun sekarang kalender minggu lalu.
Hanya setahun memulai atau menyimpulkan pada hari Kamis telah 53 kalender minggu.
Dalam Visual Basic and Visual Basic for Applications, semua tanggal fungsionalitas, kecuali untuk DateSerial fungsi, berasal dari panggilan ke berkas Oleaut32.dll. Karena kedua Format() dan DatePart() fungsi dapat kembali nomor minggu kalender untuk tanggal tertentu, keduanya dipengaruhi oleh bug ini. Untuk menghindari masalah ini, Anda harus menggunakan kode alternatif yang artikel ini menyediakan.
Mulai projek Standard EXE dalam Visual Basic. Form1 dibuat secara default.
Menambahkan dua CommandButtons Form1.
Paste kode berikut ke dalam jendela kode 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
Tahan tombol CTRL dan tekan tombol g untuk membuka jendela segera.
Menjalankan proyek, klik Command1, dan mencatat hasil berikut di jendela segera:
Perhatikan bahwa dengan format ini, semua minggu dimulai dengan Senin, sehingga 12/29/2003 harus dianggap sebagai awal minggu 1 dan bukan bagian dari 53 minggu.
Klik pada Command2 untuk melihat daftar tanggal dalam kisaran tertentu yang mengalami masalah ini. Daftar ini mencakup tanggal, minggu hari (selalu Senin), minggu # dikembalikan oleh Format (53), dan nomor minggu itu harus kembali (1.) Misalnya:
Jika Anda menggunakan Format atau DatePart fungsi, Anda perlu memeriksa nilai kembali dan, ketika 53, menjalankan cek lain dan memaksa kembali 1, jika diperlukan. Contoh kode di atas menunjukkan salah satu cara untuk melakukannya:
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
Anda dapat menghindari menggunakan fungsi-fungsi ini untuk menentukan angka minggu dengan menulis kode yang menerapkan aturan ISO 8601 yang dijelaskan di atas. Contoh berikut menunjukkan pengganti fungsi kembali angka minggu.
Mulai projek Standard EXE dalam Visual Basic. Form1 dibuat secara default.
Dari Project menu, menambahkan modul baru, dan kemudian paste kode berikut:
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
Tambahkan CommandButton Form1.
Paste kode berikut ke dalam jendela kode 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
Tahan tombol CTRL dan tekan tombol g untuk membuka jendela segera.
Menjalankan proyek dan klik pada Command1 untuk melihat hasil berikut di jendela segera:
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:200299
(http://support.microsoft.com/kb/200299/en-us/
)
Seberapa besar upaya Anda untuk menggunakan artikel ini?
Sangat sedikit
Sedikit
Sedang
Besar
Sangat besar
Berikan saran tentang apa yang dapat kami lakukan untuk menyempurnakan informasi ini
Terima kasih! Masukan Anda akan digunakan untuk membantu kami meningkatkan konten dukungan. Untuk opsi bantuan lainnya, kunjungi Halaman Beranda Bantuan dan Dukungan.