Bagaimana saya menemukan awal minggu (baik hari Minggu dan Senin) mengetahui waktu saat ini di C #?
Sesuatu seperti:
DateTime.Now.StartWeek(Monday);
Gunakan metode ekstensi. Mereka adalah jawaban untuk semuanya, Anda tahu! ;)
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(-1 * diff).Date;
}
}
Yang bisa digunakan sebagai berikut:
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
dt
UTC dan sudah merupakan awal minggu misalnya2012-09-02 16:00:00Z
yang adaMon, 03 Sep 2012 00:00:00
di waktu setempat. Jadi itu perlu dikonversidt
ke waktu lokal atau melakukan sesuatu yang sedikit lebih pintar. Juga harus mengembalikan hasilnya sebagai UTC jika inputnya adalah UTC.DateTime.Parse("2012-09-02 16:00:00Z")
mengembalikan setara waktu-lokal, dan metode ini dengan benar mengembalikan waktu yang sama, sebagai waktu lokal. Jika Anda menggunakanDateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
waktu UTC secara eksplisit, metode ini mengembalikan dengan benar 6 hari, 16 jam sebelumnya, sebagai waktu UTC. Ini bekerja persis seperti yang saya harapkan.dt
. Saya menggunakanint diff = dt.Date.DayOfWeek - startOfWeek;
Cara tercepat yang bisa saya lakukan adalah:
Jika Anda ingin hari lain dalam seminggu menjadi tanggal mulai, yang perlu Anda lakukan adalah menambahkan nilai DayOfWeek ke akhir
sumber
Sedikit lebih verbose dan sadar budaya:
sumber
CultureInfo.CurrentCulture
daripada menariknya dari utas seperti itu. Sepertinya cara aneh untuk mengaksesnya.Now
properti dua kali. Jika waktu saat ini berlalu 24:00 (atau 12:00 tengah malam) antara dua panggilan, tanggal akan berubah.Menggunakan Fluent DateTime :
sumber
public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Jelek tetapi setidaknya memberikan tanggal yang tepat kembali
Dengan awal minggu ditetapkan oleh sistem:
Tanpa:
sumber
Mari kita gabungkan jawaban yang aman untuk budaya dan jawaban metode ekstensi:
sumber
dt
alih-alihDateTime.Today
, untuk membungkus matematika dalam(offset + 7) % 7
untuk memastikan offset negatif, untuk menggunakan metode parameter tunggal yang berlebihan yang melewati budaya saat iniFirstDayOfWeek
sebagaistartOfWeek
argumen, dan mungkin (tergantung pada spesifikasi) untuk memaksa suatu zero offset hingga 7 hari offset, sehingga "Selasa lalu" tidak kembali hari ini jika sudah Selasa.Ini akan memberi Anda hari Minggu sebelumnya (saya pikir):
sumber
Ini mungkin sedikit peretasan, tetapi Anda dapat membuang properti .DayOfWeek ke int (ini enum dan karena itu tidak memiliki tipe data yang mendasarinya mengubahnya default ke int) dan menggunakannya untuk menentukan awal awal minggu ini. .
Tampaknya minggu yang ditentukan dalam enum DayOfWeek dimulai pada hari Minggu, jadi jika kita mengurangi 1 dari nilai ini, itu akan sama dengan berapa hari Senin sebelum tanggal saat ini. Kita juga perlu memetakan hari Minggu (0) sama dengan 7 jadi mengingat 1 - 7 = -6 hari Minggu akan memetakan ke Senin sebelumnya: -
Kode untuk hari Minggu sebelumnya lebih sederhana karena kami tidak perlu melakukan penyesuaian ini: -
sumber
Untuk hari Senin
Untuk hari minggu
sumber
sumber
Menyatukan semuanya, dengan Globalisasi dan memungkinkan untuk menentukan hari pertama dalam seminggu sebagai bagian dari panggilan yang kita miliki
sumber
sumber
Ini akan memberi Anda tengah malam pada hari Minggu pertama minggu itu:
Ini memberi Anda hari Senin pertama di tengah malam:
sumber
coba dengan ini di c # .Dengan kode ini Anda bisa mendapatkan tanggal pertama dan tanggal terakhir dari minggu tertentu. Di sini hari Minggu adalah hari pertama dan hari Sabtu adalah hari terakhir tetapi Anda dapat mengatur hari kedua sesuai dengan budaya Anda
sumber
Sudah mencoba beberapa tetapi tidak menyelesaikan masalah dengan satu minggu dimulai pada hari Senin, menghasilkan memberi saya Senin yang akan datang pada hari Minggu. Jadi saya memodifikasinya sedikit dan membuatnya bekerja dengan kode ini:
sumber
dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Langkah 1: Buat kelas statis
Langkah2: Gunakan kelas ini untuk memulai dan mengakhiri hari dalam seminggu
sumber
(6 - (dt.DayOfWeek - startOfWeek)) % 7
untuk saya terhadap unit test yang saya tulis.Metode berikut harus mengembalikan DateTime yang Anda inginkan. Pass in true untuk hari Minggu adalah hari pertama dalam seminggu, salah untuk hari Senin:
sumber
Terima kasih atas contohnya. Saya harus selalu menggunakan "CurrentCulture" hari pertama dalam seminggu dan untuk array saya perlu tahu persis Daynumber .. jadi di sini adalah ekstensi pertama saya:
sumber
Sepertinya belum ada yang menjawab ini dengan benar. Saya akan menempelkan solusi saya di sini kalau-kalau ada yang membutuhkannya. Kode berikut berfungsi terlepas dari apakah hari pertama dalam seminggu adalah Senin atau minggu atau sesuatu yang lain.
sumber
Modulo di C # berfungsi buruk untuk -1mod7 (harus 6, c # pengembalian -1) jadi ... "oneliner" solusi untuk ini akan terlihat seperti ini :)
sumber
Sama untuk akhir minggu (dengan gaya @Compile jawaban ini):
sumber
Anda dapat menggunakan perpustakaan Payung yang sangat baik :
Namun, mereka tidak tampaknya telah disimpan Senin sebagai hari pertama dalam minggu itu (lihat properti
nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn
), sehingga solusi lokal sebelumnya sedikit lebih baik. DisayangkanSunting : melihat lebih dekat pada pertanyaan, sepertinya Payung mungkin benar-benar berfungsi untuk itu juga:
Meskipun perlu dicatat bahwa jika Anda meminta Senin sebelumnya pada hari Senin, itu akan memberi Anda tujuh hari kembali. Tapi ini juga berlaku jika Anda menggunakan
BeginningOfWeek
, yang sepertinya seperti bug :(.sumber
Ini akan mengembalikan tanggal awal minggu dan akhir minggu:
Saya telah memposting kode lengkap untuk menghitung awal / akhir minggu, bulan, kuartal dan tahun di blog saya ZamirsBlog
sumber
sumber
Ini adalah kombinasi dari beberapa jawaban. Ini menggunakan metode ekstensi yang memungkinkan budaya untuk diteruskan, jika tidak dilewati, budaya saat ini digunakan. Ini akan memberinya fleksibilitas maksimal dan digunakan kembali.
Contoh penggunaan:
sumber
jika Anda ingin hari Sabtu atau Minggu atau hari apa pun dalam minggu tetapi tidak melebihi minggu ini (Sat-Sun), saya memberi Anda kode ini.
sumber
Kami menyukai one-liners: Dapatkan perbedaan antara hari pertama budaya saat ini minggu dan hari ini lalu kurangi jumlah hari dari hari saat ini
sumber
Sebagai lanjutan dari Kompilasi Jawaban 'Ini, gunakan metode berikut untuk mendapatkan tanggal untuk setiap hari dalam seminggu:
sumber
Cobalah untuk membuat fungsi yang menggunakan rekursi. Objek DateTime Anda adalah input dan fungsi mengembalikan objek DateTime baru yang merupakan singkatan dari awal minggu.
sumber
Menghitung dengan cara ini memungkinkan Anda memilih hari dalam seminggu yang menunjukkan awal minggu baru (dalam contoh saya memilih Senin).
Perhatikan bahwa melakukan perhitungan ini untuk hari yang merupakan hari Senin akan memberikan hari Senin saat ini dan bukan yang sebelumnya.
sumber