Saya ingin mendapatkan hari pertama dan hari terakhir bulan di mana tanggal tertentu berada. Tanggal berasal dari nilai di bidang UI.
Jika saya menggunakan pemilih waktu, saya bisa katakan
var maxDay = dtpAttendance.MaxDate.Day;
Tapi saya mencoba untuk mendapatkannya dari objek DateTime. Jadi jika saya punya ini ...
DateTime dt = DateTime.today;
Bagaimana cara mendapatkan hari pertama dan hari terakhir bulan itu dt
?
_Date
variabel. Apa "min dan maks" yang Anda coba dapatkan dari nilai itu?Jawaban:
DateTime
struktur hanya menyimpan satu nilai, bukan rentang nilai.MinValue
danMaxValue
merupakan bidang statis, yang menyimpan rentang nilai yang mungkin untuk instanceDateTime
struktur. Bidang-bidang ini statis dan tidak berhubungan dengan contoh khususDateTime
. Mereka berhubungan denganDateTime
mengetik sendiri.Bacaan yang disarankan: statis (C # Referensi)
UPDATE: Memperoleh rentang bulan:
sumber
lastDayofMonth
menjadifirstDayOfMonth.AddMonths(1).AddSeconds(-1);
?AddTicks(-1)
, tetapi jika kita tidak peduli tentang waktu bagian dan hanya memikirkan bagian tanggal, maka hari-hari akan baik< firstDayOfNextMonth
bukan<= lastDayOfMonth
. Dengan cara itu akan selalu berhasil terlepas dari rinciannya. (Saya yakin kutu akan baik-baik saja, tetapi siapa yang tahu apa yang akan terjadi di masa depan ... nanoticks?)Ini lebih merupakan komentar panjang tentang jawaban @Sergey dan @ Steffen. Setelah menulis kode yang sama sendiri di masa lalu, saya memutuskan untuk memeriksa apa yang paling performan sambil mengingat bahwa kejelasan juga penting.
Hasil
Berikut ini adalah contoh hasil uji coba untuk 10 juta iterasi:
Kode
Saya menggunakan LINQPad 4 (dalam mode Program C #) untuk menjalankan tes dengan optimasi kompiler dihidupkan. Berikut adalah kode yang diuji yang diperhitungkan sebagai metode Ekstensi untuk kejelasan dan kenyamanan:
Analisis
Saya terkejut dengan beberapa hasil ini.
Meskipun tidak banyak di dalamnya,
FirstDayOfMonth_AddMethod
itu sedikit lebih cepat daripadaFirstDayOfMonth_NewMethod
di sebagian besar menjalankan tes. Namun, saya pikir yang terakhir memiliki niat yang sedikit lebih jelas sehingga saya memiliki preferensi untuk itu.LastDayOfMonth_AddMethod
jelas kalah melawanLastDayOfMonth_AddMethodWithDaysInMonth
,LastDayOfMonth_NewMethod
danLastDayOfMonth_NewMethodWithReuseOfExtMethod
. Antara tiga tercepat tidak ada banyak di dalamnya sehingga turun ke preferensi pribadi Anda. Saya memilih kejelasanLastDayOfMonth_NewMethodWithReuseOfExtMethod
dengan menggunakan kembali metode ekstensi lain yang bermanfaat. IMHO maksudnya lebih jelas dan saya bersedia menerima biaya kinerja yang kecil.LastDayOfMonth_SpecialCase
mengasumsikan Anda memberikan yang pertama bulan dalam kasus khusus di mana Anda mungkin sudah menghitung tanggal itu dan menggunakan metode add denganDateTime.DaysInMonth
untuk mendapatkan hasilnya. Ini lebih cepat daripada versi lain, seperti yang Anda harapkan, tetapi kecuali Anda sangat membutuhkan kecepatan, saya tidak melihat gunanya memiliki case khusus ini di gudang senjata Anda.Kesimpulan
Berikut ini adalah kelas metode ekstensi dengan pilihan saya dan dalam perjanjian umum dengan @Steffen saya percaya:
Jika Anda sudah sejauh ini, terima kasih atas waktunya! Sudah menyenangkan: ¬). Berikan komentar jika Anda memiliki saran lain untuk algoritme ini.
sumber
LastDayOfMonth_AddMethod_SpecialCase
(atau sesuatu seperti itu). Mengharapkan hari pertama bulan sebagai parameter, saya pikir tercepat harus apaLastDayOfMonth_AddMethod
! Jadi itu akan sesederhana:return value.AddMonths(1).AddDays(-1);
Mendapatkan rentang bulan dengan .Net API (dengan cara lain):
sumber
"
Last day of month
" sebenarnya "First day of *next* month, minus 1
". Jadi inilah yang saya gunakan, tidak perlu metode "DaysInMonth":CATATAN: Alasan saya menggunakan
AddMinutes(-1)
, bukan diAddDays(-1)
sini adalah karena biasanya Anda memerlukan fungsi tanggal ini untuk pelaporan untuk beberapa periode tanggal, dan ketika Anda membuat laporan untuk suatu periode, "tanggal akhir" sebenarnya harus berupa sesuatuOct 31 2015 23:59:59
sehingga laporan Anda berfungsi dengan benar - termasuk semua data dari hari terakhir bulan ini.Yaitu Anda benar-benar mendapatkan " momen terakhir bulan ini" di sini. Bukan hari terakhir.
Oke, saya akan tutup mulut sekarang.
sumber
sumber
description
yang membantu menjelaskan kode Anda. Terima kasihDi sini Anda dapat menambahkan satu bulan untuk hari pertama bulan ini daripada menghapus 1 hari dari hari itu.
sumber
Jika Anda hanya peduli dengan tanggalnya
Jika Anda ingin menghemat waktu
sumber
Jawaban yang diterima di sini tidak memperhitungkan contoh Jenis DateTime. Misalnya jika instance DateTime asli Anda adalah Jenis UTC maka dengan membuat instance DateTime baru Anda akan membuat instance Jenis Tidak Dikenal yang kemudian akan diperlakukan sebagai waktu lokal berdasarkan pengaturan server. Oleh karena itu cara yang lebih tepat untuk mendapatkan tanggal pertama dan terakhir bulan ini adalah sebagai berikut:
Dengan cara ini Jenis asli dari DateTime disimpan.
sumber
Coba yang ini:
sumber
Saya menggunakan ini dalam skrip saya (berfungsi untuk saya) tetapi saya membutuhkan tanggal penuh tanpa perlu memotongnya menjadi hanya tanggal dan tidak ada waktu.
sumber
Cobalah ini. Ini pada dasarnya menghitung jumlah hari yang telah berlalu
DateTime.Now
, kemudian kurangi satu dari itu dan menggunakan nilai baru untuk menemukan yang pertama dari bulan berjalan. Dari sana ia menggunakan ituDateTime
dan menggunakan.AddMonths(-1)
untuk mendapatkan yang pertama dari bulan sebelumnya.Mendapatkan hari terakhir bulan lalu pada dasarnya melakukan hal yang sama kecuali itu menambah satu ke jumlah hari dalam sebulan dan mengurangi nilai itu dari
DateTime.Now.AddDays
, memberikan Anda hari terakhir bulan sebelumnya.sumber
Untuk budaya Persia
sumber
Kamu bisa melakukannya
sumber
cara mudah untuk melakukannya
sumber
sumber