Dalam proyek C # kami, kami memiliki kebutuhan untuk merepresentasikan tanggal tanpa waktu. Saya tahu tentang keberadaan DateTime, namun, ini juga menyertakan waktu dalam sehari. Saya ingin menjelaskan bahwa variabel dan argumen metode tertentu berbasis tanggal . Oleh karena itu saya tidak dapat menggunakan DateTime.Date
properti itu
Apa pendekatan standar untuk masalah ini? Tentunya saya bukan orang pertama yang mengalami ini? Mengapa tidak ada Date
kelas di C #?
Apakah ada yang punya implementasi bagus menggunakan struct dan mungkin beberapa metode ekstensi pada DateTime dan mungkin menerapkan beberapa operator seperti == dan <,>?
DateTime
?Jawaban:
Izinkan saya menambahkan pembaruan untuk pertanyaan klasik ini:
Perpustakaan Noda Time Jon Skeet sekarang sudah cukup matang, dan memiliki tipe khusus tanggal yang disebut
LocalDate
. (Lokal dalam hal ini hanya berarti lokal untuk seseorang , tidak harus lokal ke komputer tempat kode berjalan.)Jenis khusus tanggal yang dipanggil
Date
adalah tambahan yang diusulkan ke .NET Core, melalui proyek corefxlab . Anda akan menemukannya di dalamSystem.Time
paket, bersama denganTimeOfDay
tipe, dan beberapa metode ekstensi untuk tipe yang ada.Saya telah mempelajari masalah ini secara signifikan, jadi saya juga akan membagikan beberapa alasan perlunya jenis-jenis ini:
Ada perbedaan logis antara nilai tanggal-saja, dan nilai tanggal-di-tengah malam.
Tidak setiap hari lokal memiliki tengah malam di setiap zona waktu. Contoh: Transisi waktu musim panas musim semi-maju Brasil menggerakkan jam dari 11:59:59 ke 01:00:00.
Tanggal-waktu selalu mengacu pada waktu tertentu dalam hari, sedangkan tanggal-saja dapat mengacu pada awal hari, akhir hari, atau seluruh rentang hari.
Melampirkan waktu ke tanggal dapat menyebabkan tanggal berubah karena nilai diteruskan dari satu lingkungan ke lingkungan lain, jika zona waktu tidak diawasi dengan sangat hati-hati. Ini biasanya terjadi di JavaScript (yang
Date
objeknya sebenarnya adalah tanggal + waktu), tetapi dapat dengan mudah terjadi di .NET juga, atau dalam serialisasi saat data dilewatkan antara JavaScript dan .NET.Membuat serial
DateTime
dengan XML atau JSON (dan lainnya) akan selalu menyertakan waktu, bahkan jika itu tidak penting. Ini sangat membingungkan, terutama mengingat hal-hal seperti tanggal lahir dan hari jadi, yang waktunya tidak relevan.Secara arsitektural,
DateTime
adalah objek nilai DDD , tetapi melanggar Prinsip Bertanggung Jawab Tunggal dalam beberapa cara:Ini dirancang sebagai tipe tanggal + waktu, tetapi sering digunakan sebagai hanya tanggal (mengabaikan waktu), atau waktu-hari-saja (mengabaikan tanggal). (
TimeSpan
juga sering digunakan untuk waktu-hari, tapi itu topik lain.)The
DateTimeKind
nilai yang melekat pada.Kind
properti membagi jenis tunggal menjadi tiga, yangUnspecified
semacam ini benar-benar maksud asli dari struktur, dan harus digunakan seperti itu. TheUtc
jenis disejajarkan nilai khusus dengan UTC, danLocal
aligns jenis nilai dengan zona waktu lokal lingkungan ini.Masalah dengan memiliki flag terpisah untuk jenis adalah bahwa setiap kali Anda menggunakan a
DateTime
, Anda harus memeriksa.Kind
untuk memutuskan perilaku apa yang akan diambil. Semua metode kerangka melakukan ini, tetapi yang lain sering lupa. Ini benar-benar pelanggaran SRP, karena jenisnya sekarang memiliki dua alasan berbeda untuk berubah (nilai, dan jenisnya).Keduanya menyebabkan penggunaan API yang dikompilasi, tetapi sering kali tidak masuk akal, atau memiliki kasus tepi aneh yang disebabkan oleh efek samping. Mempertimbangkan:
Singkatnya, meskipun a
DateTime
dapat digunakan untuk tanggal saja, seharusnya hanya digunakan jika setiap tempat yang menggunakannya sangat berhati-hati untuk mengabaikan waktu, dan juga sangat berhati-hati untuk tidak mencoba beralih ke dan dari UTC atau lainnya. zona waktu.sumber
System.Time.Date
akan berakhir dalam kerangka .NET: /System.Time
seperti paket lainnya. Ini belum "resmi".Saya menduga tidak ada
Date
kelas murni yang berdedikasi karena Anda sudah memilikiDateTime
yang bisa mengatasinya. MemilikiDate
akan menyebabkan duplikasi dan kebingungan.Jika Anda ingin pendekatan standar, lihat
DateTime.Date
properti yang hanya memberikan porsi tanggal aDateTime
dengan nilai waktu ditetapkan ke 12:00:00 tengah malam (00:00:00).sumber
Saya telah mengirim email ke [email protected] dan itulah jawaban mereka
Di email saya, saya mempertanyakan apakah itu karena DateTime menggunakan TimeZoneInfo untuk mendapatkan waktu mesin - dalam kepatutan Now. Jadi menurut saya itu karena "aturan bisnis" "terlalu digabungkan", mereka menegaskannya kepada saya.
sumber
SpaceTime
kelas! Hei, menurut Einstein, ruang dan waktu sangat erat sehingga kita tidak perlu membedakan keduanya, bukan? (!!!!!!!!!!!) Aku agak baru untuk C #, tapi saya harus mengatakan, itu adalah ladang ranjau yang datang dari VB.NET mana, cukup,date
,Today()
,now
, dll adaDateTime
awalan sampah, tidak ada menyia-nyiakan. (Dan titik koma dan sensitivitas huruf ini benar-benar menjengkelkan! Tembak saja saya sekarang!)Date
tipe dan hasil harus bertipeDate
- jikaDate
tipe result diharapkan sebagai string tanpa waktu. Misalnya Delphi juga memiliki Date sebagai DateTime, tetapi ketik info yang berbeda untuk Date dan DateTime.Saya membuat struct Tanggal sederhana untuk saat-saat ketika Anda memerlukan tanggal sederhana tanpa mengkhawatirkan porsi waktu, zona waktu, lokal vs. utc, dll.
https://github.com/claycephus/csharp-date
sumber
Jika Anda perlu menjalankan perbandingan tanggal, gunakan
Jika Anda menampilkan ke layar gunakan
sumber
Izinkan saya berspekulasi: Mungkin karena sampai SQL Server 2008 belum ada datatype Date di SQL sehingga akan sulit jadi simpan di SQL server ?? Dan apakah itu Produk Microsoft?
sumber
Entah kenapa seperti itu. Ada banyak keputusan desain yang buruk dalam kerangka .NET. Namun, menurut saya ini cukup kecil. Anda selalu dapat mengabaikan bagian waktu, jadi meskipun beberapa kode memutuskan untuk merujuk DateTime lebih dari sekedar tanggal, kode yang peduli seharusnya hanya melihat bagian tanggal. Alternatifnya, Anda bisa membuat tipe baru yang hanya mewakili tanggal dan menggunakan fungsi di DateTime untuk melakukan pekerjaan berat (penghitungan).
sumber
Mengapa? Kami hanya bisa berspekulasi dan tidak banyak membantu memecahkan masalah teknik. Tebakan yang bagus adalah yang
DateTime
berisi semua fungsionalitas yang dimiliki oleh struct semacam itu.Jika itu benar-benar penting bagi Anda, cukup bungkus
DateTime
dalam struct Anda yang tidak dapat diubah yang hanya memperlihatkan tanggal (atau lihatDateTime.Date
propertinya).sumber
Selain jawaban Robert, Anda juga memiliki
DateTime.ToShortDateString
metodenya. Juga, jika Anda benar-benar menginginkan objek Tanggal Anda selalu dapat menggunakan pola Adaptor dan membungkus objek DateTime hanya memperlihatkan apa yang Anda inginkan (yaitu bulan, hari, tahun).sumber
Selalu ada
DateTime.Date
properti yang memotong bagian waktuDateTime
. Mungkin Anda dapat merangkum atau membungkus DateTime dalam tipe Tanggal Anda sendiri.Dan untuk pertanyaan mengapa, saya rasa Anda harus bertanya pada Anders Heljsberg.
sumber
Karena untuk mengetahui tanggalnya, Anda harus mengetahui waktu sistem (dalam tanda centang), yang termasuk waktu - jadi mengapa membuang informasi itu?
DateTime
memilikiDate
properti jika Anda tidak peduli sama sekali tentang waktu.sumber
Ya, System.DateTime juga disegel. Saya telah melihat beberapa orang bermain game dengan ini dengan membuat kelas khusus hanya untuk mendapatkan nilai string waktu seperti yang disebutkan oleh posting sebelumnya, hal-hal seperti:
Ini mungkin tidak perlu, karena Anda dapat dengan mudah mengekstrak GetShortTimeString dari tipe DateTime lama biasa tanpa kelas baru.
sumber
Jika Anda menggunakan properti Tanggal atau Hari Ini untuk mendapatkan hanya bagian tanggal dari objek DateTime.
Kemudian Anda akan mendapatkan komponen tanggal hanya dengan komponen waktu disetel ke tengah malam.
sumber