Saya mencoba membandingkan cap waktu dari permintaan masuk ke nilai tersimpan basis data. SQL Server tentu saja menjaga ketepatan milidetik pada waktu itu, dan ketika membaca .NET DateTime, itu termasuk milidetik itu. Permintaan yang masuk ke sistem, bagaimanapun, tidak menawarkan presisi itu, jadi saya hanya perlu menjatuhkan milidetik.
Saya merasa seperti kehilangan sesuatu yang jelas, tetapi saya belum menemukan cara yang elegan untuk melakukannya (C #).
string
representasi terformat dari aDateTime
, mungkin diperlukan pengeditan untuk menjelaskan bahwa untuk "memotong" / "drop" milidetik berarti "menghasilkanDateTime
nilai di mana semua komponen tanggal / waktu yang sama kecualiTimeOfDay.TotalMilliseconds
adalah0
." Orang-orang tidak membaca, tentu saja, tetapi hanya untuk menghilangkan ambiguitas.Jawaban:
Berikut ini akan berfungsi untuk DateTime yang memiliki milidetik fraksional, dan juga mempertahankan properti Kind (Lokal, Utc atau Tidak Terdefinisi).
atau yang setara dan lebih pendek:
Ini dapat digeneralisasi menjadi metode ekstensi:
yang digunakan sebagai berikut:
sumber
sumber
Berikut adalah metode ekstensi berdasarkan pada jawaban sebelumnya yang akan memungkinkan Anda memotong ke resolusi apa pun ...
Pemakaian:
Kelas:
sumber
sumber
Millisecond
properti memberikan bilangan bulat antara 0 dan 999 (inklusif). Jadi jika waktu sehari sebelum operasi adalah, katakanlah23:48:49.1234567
, maka bilangan bulat itu akan menjadi123
, dan waktu hari setelah operasi adalah23:48:49.0004567
. Jadi itu belum terpotong ke sejumlah detik.Terkadang Anda ingin memotong ke sesuatu berbasis kalender, seperti tahun atau bulan. Inilah metode ekstensi yang memungkinkan Anda memilih resolusi apa pun.
sumber
Alih-alih menjatuhkan milidetik kemudian membandingkan, mengapa tidak membandingkan perbedaannya?
atau
sumber
Kurang jelas tetapi lebih dari 2 kali lebih cepat:
sumber
d.AddMilliseconds(-d.Millisecond)
tidak harus memindahkan DateTime tepat ke sebelumnya, detik penuh.d.Ticks % TimeSpan.TicksPerMillisecond
ticks (suatu tempat antara 0 dan 9.999) di luar detik Anda akan tetap ada.Untuk membulatkan ke yang kedua:
Ganti dengan
TicksPerMinute
membulatkan ke menit.Jika kode Anda sensitif terhadap kinerja, berhati-hatilah
Aplikasi saya menghabiskan 12% waktu CPU di System.DateTime.GetDatePart .
sumber
Cara untuk membaca mudah adalah ...
Dan lagi ...
sumber
var now = DateTime.Parse(DateTime.Now.ToString())
berfungsi dengan baik.Seputar tanggapan Diadistis. Ini berhasil bagi saya, kecuali saya harus menggunakan Lantai untuk menghapus bagian pecahan divisi sebelum perkalian. Begitu,
menjadi
Saya akan mengharapkan pembagian dua nilai Long menghasilkan Long, sehingga menghapus bagian desimal, tetapi mengatasinya sebagai Double yang meninggalkan nilai yang sama persis setelah perkalian.
Eppsy
sumber
2 Metode ekstensi untuk solusi yang disebutkan di atas
pemakaian:
sumber
Bukan solusi tercepat tetapi sederhana dan mudah dipahami:
sumber
Dan Dengan Menggunakan
: P
sumber
string
bukanDateTime
, tetapi ini menghilangkan komponen waktu dari output sepenuhnya . (Itu membuat mengaksesToday
properti tidak perlu juga.)Metode Baru
// tentukan parameter pass String dd-mmm-yyyy return 24-feb-2016
Atau ditampilkan di kotak teks
// pakai PageonLoad
sumber
string
bukanDateTime
, tetapi ini menghilangkan komponen waktu dari output sepenuhnya . (Itu membuat mengaksesToday
properti tidak perlu juga.)Dalam kasus saya, saya bertujuan untuk menghemat TimeSpan dari alat datetimePicker tanpa menyimpan detik dan milidetik, dan inilah solusinya.
Pertama-tama, konversikan datetimePicker.value ke format yang Anda inginkan, yang milik saya adalah "HH: mm" lalu konversikan kembali ke TimeSpan.
sumber
string
) untuk melakukan ini adalahDateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
Atau Anda bisa menggunakan variasi metode ekstensi Joe yang beroperasi padaTimeSpan
nilai dan digunakanTimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
untuk memotong detik.Ini adalah versi saya dari metode ekstensi yang diposting di sini dan dalam pertanyaan serupa. Ini memvalidasi nilai kutu dengan cara yang mudah dibaca dan mempertahankan DateTimeKind dari instance DateTime asli. (Ini memiliki efek samping yang halus tetapi relevan ketika menyimpan ke database seperti MongoDB.)
Jika tujuan sebenarnya adalah memotong DateTime ke nilai yang ditentukan (mis. Jam / Menit / Detik / MS) Saya sarankan menerapkan metode ekstensi ini dalam kode Anda. Ini memastikan bahwa Anda hanya dapat memotong ke presisi yang valid dan menjaga metadata DateTimeKind penting dari instance asli Anda:
Maka Anda dapat menggunakan metode seperti ini:
sumber
Saya tahu jawabannya cukup terlambat, tetapi cara terbaik untuk menghilangkan milidetik adalah
Coba cetak nilai variabel, itu akan menunjukkan waktu tanggal, tanpa milidetik.
sumber