Saya telah banyak Googled dan menemukan banyak solusi, tetapi tidak satupun dari mereka memberi saya angka minggu yang benar untuk 2012-12-31. Bahkan contoh di MSDN ( tautan ) gagal.
2012-12-31 adalah hari Senin, oleh karena itu seharusnya Minggu 1, tetapi setiap metode yang saya coba beri saya 53. Berikut adalah beberapa metode yang saya coba:
Dari Perpustakaan MDSN:
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;
return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
Solusi 2:
return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Solusi 3:
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;
Memperbarui
Metode berikut ini benar-benar mengembalikan 1 ketika tanggal 2012-12-31. Dengan kata lain, masalah saya adalah bahwa metode saya tidak mengikuti standar ISO-8601.
// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
// Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll
// be the same week# as whatever Thursday, Friday or Saturday are,
// and we always get those right
DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
{
time = time.AddDays(3);
}
// Return the week of our adjusted day
return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
Jawaban:
Sebagaimana dicatat dalam halaman MSDN ini ada sedikit perbedaan antara penomoran ISO8601 minggu dan .Net minggu.
Anda dapat merujuk ke artikel ini di Blog MSDN untuk penjelasan yang lebih baik: " Format ISO 8601 Week of Year di Microsoft .Net "
Sederhananya, .Net memungkinkan berminggu-minggu untuk membagi tahun sedangkan standar ISO tidak. Dalam artikel ini juga ada fungsi sederhana untuk mendapatkan nomor minggu ISO 8601 yang benar untuk minggu terakhir tahun ini.
Pembaruan Metode berikut ini benar-benar mengembalikan 1
2012-12-31
yang benar di ISO 8601 (misalnya Jerman).sumber
Mungkin ada lebih dari 52 minggu dalam setahun. Setiap tahun memiliki 52 minggu penuh + 1 atau +2 (tahun kabisat) ekstra. Mereka menebus untuk minggu ke-53.
Jadi untuk setiap tahun Anda memiliki setidaknya satu hari ekstra. Dua untuk tahun kabisat. Apakah hari-hari tambahan ini dihitung sebagai minggu tersendiri?
Berapa minggu ada benar-benar tergantung pada hari awal minggu Anda. Mari kita pertimbangkan ini untuk 2012.
Periksa pengaturan Budaya Anda saat ini untuk melihat apa yang digunakannya sebagai hari pertama dalam seminggu.
Seperti yang Anda lihat, hasilnya adalah normal.
Bahkan mungkin memiliki minggu ke-54. Terjadi setiap 28 tahun ketika tanggal 1 Januari dan 31 Desember diperlakukan sebagai minggu yang terpisah. Itu juga harus tahun kabisat.
Sebagai contoh, tahun 2000 memiliki 54 minggu. 1 Januari (sat) adalah hari satu minggu pertama, dan 31 Desember (matahari) adalah hari satu minggu kedua.
Cetakan: Tahun: 2012 Minggu: 54
Ubah CalendarWeekRule dalam contoh di atas menjadi FirstFullWeek atau FirstFourDayWeek dan Anda akan kembali 53. Mari kita mulai hari Senin, karena kita berurusan dengan Jerman.
Jadi minggu ke 53 dimulai pada hari Senin 2012-12-31, berlangsung satu hari dan kemudian berhenti.
53 adalah jawaban yang benar. Ubah Budaya menjadi Jerman jika ingin mencobanya.
sumber
Begini caranya:
Yang paling penting adalah
CalendarWeekRule
parameternya.Lihat di sini: https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.CalendarWeekRule);k(TargetFrameworkMoniker-.NETFramework
sumber
Kabar baik! Sebuah permintaan tarik menambahkan
System.Globalization.ISOWeek
ke NET Core hanya bergabung dan saat ini dijadwalkan untuk rilis 3.0. Semoga ini akan menyebar ke platform .NET lainnya dalam waktu yang tidak terlalu lama.Jenis ini memiliki tanda tangan berikut, yang harus mencakup sebagian besar kebutuhan minggu ISO :
Anda dapat menemukan kode sumber di sini .
UPDATE : API ini juga telah disertakan dalam versi 2.1 .NET Standard .
sumber
Karena sepertinya tidak ada .Net-culture yang menghasilkan angka minggu ISO-8601 yang benar, saya lebih baik mem-bypass penetapan built-in week sama sekali, dan melakukan perhitungan secara manual, daripada mencoba untuk memperbaiki sebagian yang benar hasil.
Yang akhirnya saya dapatkan adalah metode ekstensi berikut:
Pertama-tama,
((int)date.DayOfWeek + 6) % 7)
tentukan angka hari kerja, 0 = Senin, 6 = Minggu.date.AddDays(-((int)date.DayOfWeek + 6) % 7)
menentukan tanggal hari Senin dari tanggal minggu yang diminta.Tiga hari kemudian adalah target Kamis, yang menentukan tahun berapa dalam minggu ini.
Jika Anda membagi angka hari (berbasis nol) dalam tahun dengan tujuh (bulat), Anda mendapatkan nomor minggu (berbasis nol) di tahun tersebut.
Dalam c #, hasil perhitungan integer dibulatkan ke bawah secara implisit.
sumber
Ticks
adalah jumlah peningkatan 100 nanodetik sejak 1 Januari 0001. Mengingat bahwa ada 86.400 detik dalam sehari kita dapat menulis:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
Di .NET 3.0 dan yang lebih baru Anda bisa menggunakan
ISOWeek.GetWeekOfDate
-Metode .Perhatikan bahwa tahun dalam format angka tahun + minggu mungkin berbeda dari tahun
DateTime
karena minggu yang melewati batas tahun.sumber
C # ke Powershell port dari kode di atas dari il_guru :
sumber
Cara termudah untuk menentukan angka minggu gaya ISO 8601 menggunakan c # dan kelas DateTime.
Tanyakan ini: berapa banyak hari Kamis dalam setahun adalah hari Kamis minggu ini. Jawabannya sama dengan angka minggu yang diinginkan.
sumber
Ini bekerja baik untuk budaya AS dan Rusia. ISO 8601 juga akan benar, karena minggu Rusia dimulai pada hari Senin.
sumber
Berikut adalah versi ekstensi dan versi nullable dari jawaban il_guru .
Perpanjangan:
Tidak dapat dibatalkan:
Penggunaan:
sumber
Pertanyaannya adalah: Bagaimana Anda mendefinisikan apakah satu minggu di 2012 atau di 2013? Anggapan Anda, saya kira, adalah karena 6 hari dalam seminggu adalah pada tahun 2013, minggu ini harus ditandai sebagai minggu pertama tahun 2013.
Tidak yakin apakah ini cara yang tepat untuk pergi. Minggu itu dimulai pada 2012 (Pada Senin 31 Desember), jadi harus ditandai sebagai minggu terakhir 2012, oleh karena itu harus menjadi yang ke-53 tahun 2012. Minggu pertama 2013 harus dimulai pada hari Senin tanggal 7.
Sekarang, Anda dapat menangani kasus minggu tepi tertentu (minggu pertama dan terakhir tahun itu) menggunakan informasi hari dalam seminggu. Itu semua tergantung pada logika Anda.
sumber
sumber
Berdasarkan jawaban il_guru, saya membuat versi ini untuk kebutuhan saya sendiri yang juga mengembalikan komponen tahun.
sumber
Dua metode ini akan membantu, dengan asumsi minggu kita dimulai pada hari Senin
sumber
Satu tahun memiliki 52 minggu dan 1 hari atau 2 dalam kasus satu tahun putaran (52 x 7 = 364). 2012-12-31 akan menjadi minggu 53, satu minggu yang hanya akan memiliki 2 hari karena 2012 adalah tahun putaran.
sumber
sumber