Bagaimana cara menghitung selisih bulan antara dua tanggal dalam C #?
Apakah ada yang setara dengan DateDiff()
metode VB di C #. Saya perlu menemukan perbedaan dalam bulan antara dua tanggal yang terpisah tahun. Dokumentasi mengatakan bahwa saya dapat menggunakan TimeSpan
seperti:
TimeSpan ts = date1 - date2;
tapi ini memberi saya data dalam Days. Saya tidak ingin membagi angka ini dengan 30 karena tidak setiap bulan adalah 30 hari dan karena dua nilai operan terpisah satu sama lain, saya takut membagi dengan 30 mungkin memberi saya nilai yang salah.
Ada saran?
DateDiff
implantasi: Referenceource.microsoft.com/#Microsoft.VisualBasic/… .Jawaban:
Mengasumsikan hari dalam bulan tidak relevan (mis. Perbedaan antara 2011.1.1 dan 2010.12.31 adalah 1), dengan date1> date2 memberikan nilai positif dan date2> date1 nilai negatif
Atau, dengan asumsi Anda menginginkan jumlah perkiraan 'bulan rata-rata' antara kedua tanggal, yang berikut ini akan berfungsi untuk semua kecuali perbedaan tanggal yang sangat besar.
Catatan, jika Anda menggunakan solusi yang terakhir maka unit test Anda harus menyatakan rentang tanggal terluas tempat aplikasi Anda dirancang untuk bekerja dan memvalidasi hasil perhitungan yang sesuai.
Perbarui (dengan terima kasih kepada Gary )
Jika menggunakan metode 'bulan rata-rata', angka yang sedikit lebih akurat untuk digunakan untuk 'jumlah hari rata-rata per tahun' adalah 365,2425 .
sumber
(date1.Year - date2.Year) * 12 + date1.Month - date2.Month + (date1.Day >= date2.Day ? 0 : -1)
Berikut adalah solusi komprehensif untuk mengembalikan a
DateTimeSpan
, mirip dengan aTimeSpan
, kecuali bahwa itu mencakup semua komponen tanggal selain komponen waktu.Pemakaian:
Keluaran:
Untuk kenyamanan, saya telah memasukkan logika ke dalam
DateTimeSpan
struct, tetapi Anda dapat memindahkan metode ini keCompareDates
mana pun yang Anda inginkan. Perhatikan juga, tidak masalah tanggal mana yang datang sebelum yang lain.sumber
34
hari untuk perbedaan waktu tanggal ini sebenarnya adalah35
timeanddate.com/date/…31
dan tanggal "melewati" bulan dengan hari lebih sedikit. Saya telah membalikkan logikanya (sehingga berubah dari awal ke lambat daripada sebaliknya) dan sekarang mengakumulasi bulan tanpa mengubah tanggal saat ini (dan dengan demikian melewati di antara bulan dengan hari yang lebih sedikit) Masih belum sepenuhnya yakin apa hasil yang ideal harus ketika membandingkan10/31/2012
ke11/30/2012
. Sekarang hasilnya adalah1
bulan.2020-02-29
untuk2021-06-29
- ia mengembalikan "1thn 4m 1d", tetapi nilai harus "1thn 4m 0d", kan?Anda bisa melakukannya
sumber
if ( date1.AddMonths(x).Month == date2.Month )
maka Anda hanya menggunakan x +1 sebagai hitungan bulanJika Anda menginginkan jumlah pasti bulan penuh, selalu positif (2000-01-15, 2000-02-14 menghasilkan 0), mengingat sebulan penuh adalah saat Anda mencapai hari yang sama di bulan berikutnya (seperti perhitungan umur)
Sunting alasan: kode lama tidak benar dalam beberapa kasus seperti:
sumber
new { From = new DateTime(2015, 12, 31), To = new DateTime(2015, 6, 30), Result = 6 }
tes akan gagal karena hasilnya 5.new { From = new DateTime(2015, 12, 31), To = new DateTime(2016, 06, 30), Result = 6 }
. "Bug" terletak padato.Day < from.Day
kode yang tidak memperhitungkan bahwa bulan dapat berakhir pada "hari dalam sebulan" yang berbeda. Dalam hal ini dari 31 Desember 2015, hingga 30 Juni 2016, 6 bulan penuh akan berlalu (sejak Juni memiliki 30 hari) tetapi kode Anda akan kembali 5.Saya memeriksa penggunaan metode ini di VB.NET melalui MSDN dan tampaknya memiliki banyak penggunaan. Tidak ada metode bawaan seperti itu di C #. (Bahkan itu bukan ide yang baik) Anda dapat memanggil VB di C #.
Microsoft.VisualBasic.dll
ke proyek Anda sebagai referensiMicrosoft.VisualBasic.DateAndTime.DateDiff
dalam kode Andasumber
Microsoft.VisualBasic.dll
modul harus dimuat, tetapi waktu yang diperlukan untuk melakukan itu dapat diabaikan. Tidak ada alasan untuk menipu diri Anda sendiri dari fitur yang telah teruji dan berguna hanya karena Anda telah memilih untuk menulis program Anda dalam C #. (Ini berlaku untuk hal-hal sepertiMy.Application.SplashScreen
juga.)using
pernyataan yang benar , tetapi saya ragu akan ada kerusakan serius.DateAndTime.Year()
ada, mengingat yangDateTime
memilikiYear
properti. Itu hanya ada untuk membuat VB.NET tampak lebih seperti VB6. Sebagai mantan programmer VB6, saya bisa menghargai ini ;-)Untuk mendapatkan perbedaan dalam bulan (termasuk awal dan akhir), terlepas dari tanggal:
sumber
start
danend
identik. Lalu Anda mendapatkan hasil 1. Bagaimana itu benar? Mengapa Anda menambahkan 1 ke hasilnya? Siapa yang memberikan suara untuk jawaban ini: - /?Gunakan Waktu Noda :
(contoh sumber)
sumber
Saya hanya perlu sesuatu yang sederhana untuk memenuhi misalnya tanggal kerja di mana hanya bulan / tahun dimasukkan, jadi ingin tahun yang berbeda dan bulan bekerja. Inilah yang saya gunakan, di sini hanya untuk kegunaan saja
.NET Fiddle
sumber
Anda bisa menggunakan kelas DateDiff dari Perpustakaan Periode Waktu untuk .NET :
sumber
Inilah kontribusi saya untuk mendapatkan perbedaan dalam Bulan yang menurut saya akurat:
Pemakaian:
Anda dapat membuat metode lain yang disebut DiffYears dan menerapkan logika yang persis sama seperti di atas dan AddYears alih-alih AddMonths di loop sementara.
sumber
Ini bekerja untuk apa saya membutuhkannya. Hari bulan tidak menjadi masalah dalam kasus saya karena selalu merupakan hari terakhir bulan itu.
sumber
Cara yang paling tepat adalah ini yang mengembalikan perbedaan dalam beberapa bulan berdasarkan fraksi:
sumber
Ini adalah solusi sederhana yang paling tidak cocok untuk saya. Ini mungkin bukan yang tercepat karena menggunakan fitur AddMonth DateTime yang keren dalam satu lingkaran:
sumber
sumber
Ini dari perpustakaan saya sendiri, akan mengembalikan perbedaan bulan antara dua tanggal.
sumber
Jan-31-2014
danDec-31-2013
Anda dapat memiliki fungsi seperti ini.
Misalnya, mulai 2012/12/27 hingga 2012/12/29 menjadi 3 hari. Demikian juga, dari 2012/12/15 hingga 2013/01/15 menjadi 2 bulan, karena hingga 2013/01/14 adalah 1 bulan. mulai tanggal 15 bulan kedua dimulai.
Anda dapat menghapus "=" pada kondisi if kedua, jika Anda tidak ingin memasukkan kedua hari dalam perhitungan. yaitu, dari 2012/12/15 hingga 2013/01/15 adalah 1 bulan.
sumber
Anda dapat menggunakan ekstensi berikut: Kode
Penerapan !
sumber
Inilah solusi yang jauh lebih ringkas menggunakan VB.Net DateDiff untuk Tahun, Bulan, Hari saja. Anda dapat memuat pustaka DateDiff di C # juga.
date1 harus <= date2
VB.NET
C #
sumber
Ini sebagai jawaban atas jawaban Kirk Woll. Saya belum memiliki poin reputasi yang cukup untuk membalas komentar ...
Saya menyukai solusi Kirk dan akan merobeknya tanpa malu-malu dan menggunakannya dalam kode saya, tetapi ketika saya melihatnya, saya menyadari bahwa itu terlalu rumit. Pergantian dan perulangan yang tidak perlu, dan konstruktor publik yang tidak berguna untuk digunakan.
Inilah penulisan ulang saya:
Penggunaan1, hampir sama:
Penggunaan2, serupa:
sumber
Dalam kasus saya, diperlukan untuk menghitung bulan lengkap dari tanggal mulai ke hari sebelum hari ini di bulan berikutnya atau dari awal hingga akhir bulan.
Mis: mulai 1/1/2018 hingga 31/1/2018 adalah bulan lengkap
Ex2: dari 5/1/2018 hingga 4/2/2018 adalah bulan lengkap
jadi berdasarkan ini di sini adalah solusi saya:
Pemakaian:
Catatan: dalam kasus saya itu diperlukan untuk menghitung hari-hari yang tersisa setelah bulan-bulan lengkap jadi jika bukan kasus Anda, Anda dapat mengabaikan hasil hari atau bahkan Anda dapat mengubah metode pengembalian dari tuple ke integer.
sumber
Solusi ini untuk perhitungan Sewa / berlangganan, di mana perbedaan tidak berarti menjadi pengurangan, itu dimaksudkan sebagai rentang dalam dua tanggal tersebut.
sumber
Ada 3 kasus: tahun yang sama, tahun sebelumnya dan tahun-tahun lainnya.
Jika hari dalam sebulan tidak masalah ...
sumber
Saya menulis fungsi untuk menyelesaikan ini, karena cara-cara lain tidak berhasil untuk saya.
sumber
Pemahaman saya tentang perbedaan bulan total antara 2 tanggal memiliki bagian integral dan fraksional (tanggal penting).
Bagian integral adalah perbedaan bulan penuh.
Bagian fraksional, bagi saya, adalah perbedaan dari% hari (ke hari penuh bulan) antara bulan awal dan akhir.
Dengan ekstensi ini, itulah hasilnya:
sumber
Tidak ada banyak jawaban yang jelas tentang ini karena Anda selalu mengasumsikan sesuatu.
Solusi ini menghitung antara dua tanggal bulan antara asumsi Anda ingin menyimpan hari bulan untuk perbandingan, (artinya hari bulan dipertimbangkan dalam perhitungan)
Contoh, jika Anda memiliki tanggal 30 Jan 2012, 29 Feb 2012 tidak akan menjadi sebulan tetapi 01 Maret 2013 akan.
Sudah diuji cukup menyeluruh, mungkin akan membersihkannya nanti saat kita menggunakannya, tapi di sini:
sumber
Berdasarkan pada pekerjaan DateTimeSpan yang sangat baik yang dilakukan di atas, saya telah menormalkan kode sedikit; ini tampaknya bekerja dengan cukup baik:
sumber
CompareDates(x, y)
manax={01/02/2019 00:00:00}
dany={01/05/2020 00:00:00}
kemudianMonths
memberi saya2
Fungsi statis sederhana ini menghitung fraksi bulan antara dua Datetimes, misalnya
Fungsi ini mengasumsikan bahwa kencan pertama lebih kecil dari kencan kedua. Untuk berurusan dengan interval waktu negatif, seseorang dapat memodifikasi fungsi dengan mudah dengan memperkenalkan tanda dan swap variabel di awal.
sumber
Untuk dapat menghitung perbedaan antara 2 tanggal dalam bulan adalah hal yang sangat logis untuk dilakukan, dan diperlukan dalam banyak aplikasi bisnis. Beberapa coders di sini yang telah memberikan komentar seperti - apa perbedaan dalam bulan antara "1 Mei 2010" dan "16 Juni 2010, apa perbedaan dalam bulan antara 31 Desember 2010 dan 1 Januari 2011? - telah gagal untuk memahami dasar-dasar aplikasi bisnis.
Berikut adalah jawaban untuk 2 komentar di atas - Jumlah bulan antara 1-Mei-2010 dan 16 Juni-2010 adalah 1 bulan, jumlah bulan antara 31-Desember-2010 dan 1-Januari-2011 adalah 0. akan sangat bodoh untuk menghitungnya sebagai 1,5 bulan dan 1 detik, seperti yang disarankan oleh pembuat kode di atas.
Orang-orang yang telah mengerjakan kartu kredit, pemrosesan hipotek, pemrosesan pajak, pemrosesan sewa, perhitungan bunga bulanan, dan beragam solusi bisnis lainnya akan setuju.
Masalahnya adalah bahwa fungsi seperti itu tidak termasuk dalam C # atau VB.NET dalam hal ini. Datediff hanya memperhitungkan tahun atau komponen bulan, jadi sebenarnya tidak berguna.
Berikut adalah beberapa contoh kehidupan nyata di mana Anda perlu dan dapat dengan benar menghitung bulan:
Anda tinggal di sewa jangka pendek dari 18 Februari hingga 23 Agustus. Berapa bulan tinggal di sana? Jawabannya sederhana - 6 bulan
Anda memiliki rekening bank tempat bunga dihitung dan dibayar pada akhir setiap bulan. Anda menyetor uang pada 10 Juni dan mengeluarkannya pada 29 Oktober (tahun yang sama). Berapa bulan yang Anda minati? Jawaban yang sangat sederhana - 4 bulan (lagi hari tambahan tidak masalah)
Dalam aplikasi bisnis, sebagian besar waktu, ketika Anda perlu menghitung bulan, itu karena Anda perlu tahu bulan 'penuh' berdasarkan bagaimana manusia menghitung waktu; tidak didasarkan pada beberapa pemikiran abstrak / tidak relevan.
sumber
Diperluas struct Kirks dengan ToString (format) dan Durasi (ms panjang)
sumber
sumber