Cara memeriksa apakah suatu NSDate
milik hari ini?
Saya biasa memeriksanya menggunakan 10 karakter pertama dari [aDate description]
. [[aDate description] substringToIndex:10]
mengembalikan string seperti "YYYY-MM-DD"
jadi saya membandingkan string dengan string yang dikembalikan oleh [[[NSDate date] description] substringToIndex:10]
.
Apakah ada cara yang lebih cepat dan / atau rapi untuk memeriksa?
Terima kasih.
ios
objective-c
cocoa-touch
nsdate
nscalendar
Seunghoon
sumber
sumber
Jawaban:
Di macOS 10.9+ & iOS 8+, ada metode di NSCalendar / Kalender yang melakukan ini!
Jadi, Anda cukup melakukannya
Tujuan-C:
Swift 3:
sumber
Anda dapat membandingkan komponen tanggal:
Edit:
Saya lebih suka metode Stefan lebih, saya pikir itu membuat pernyataan yang lebih bersih dan lebih dimengerti:
Chris, saya sudah memasukkan saran Anda. Saya harus melihat era apa itu, jadi bagi siapa pun yang tidak tahu, itu membedakan antara SM dan AD. Ini mungkin tidak perlu bagi kebanyakan orang, tetapi mudah untuk memeriksa dan menambahkan kepastian, jadi saya sudah memasukkannya. Jika Anda ingin kecepatan, ini mungkin bukan metode yang baik.
Perhatikan seperti banyak jawaban pada SO, setelah 7 tahun ini benar-benar ketinggalan zaman. Di Swift sekarang gunakan saja
.isDateInToday
sumber
Ini merupakan cabang dari pertanyaan Anda, tetapi jika Anda ingin mencetak NSDate dengan "Today" atau "Yesterday", gunakan fungsi ini
untuk NSDateFormatter
sumber
Saya akan mencoba untuk mendapatkan tanggal hari ini dinormalisasi ke tengah malam dan tanggal kedua, menormalkan ke tengah malam kemudian membandingkan jika itu adalah NSDate yang sama.
Dari contoh Apple, inilah cara Anda menormalkan hingga tanggal tengah malam hari ini, lakukan hal yang sama untuk kencan kedua dan bandingkan:
sumber
Bekerja Swift 3 & 4 ekstensi saran oleh Catfish_Man:
sumber
Tidak perlu menyulap dengan komponen, era dan hal-hal.
NSCalendar menyediakan metode untuk memulai unit waktu tertentu untuk tanggal yang ada.
Kode ini akan memulai hari ini dan tanggal lainnya dan membandingkannya. Jika dievaluasi
NSOrderedSame
, kedua tanggal adalah pada hari yang sama - jadi hari ini.sumber
Bekerja untuk saya di Swift 2.0
sumber
Versi cepat jawaban terbaik:
sumber
Lihat entri dokumentasi Apple yang berjudul "Melakukan Penghitungan Kalender" [tautan] .
Listing 13 pada halaman itu menyarankan bahwa untuk menentukan jumlah tengah malam antar hari, Anda menggunakan:
Anda kemudian dapat menentukan apakah dua hari sama dengan menggunakan metode itu dan melihat apakah itu mengembalikan 0 atau tidak.
sumber
Anda juga dapat memeriksa interval waktu antara tanggal yang Anda miliki, dan tanggal saat ini:
Ini akan memberi Anda interval waktu, dalam detik, antara myDate dan tanggal / waktu saat ini.
Link .
Sunting: Catatan untuk semua orang: Saya sangat menyadari bahwa [myDate timeIntervalSinceNow] tidak menentukan apakah myDate hari ini atau tidak.
Saya meninggalkan jawaban ini sebagaimana adanya sehingga jika seseorang mencari sesuatu yang serupa dan [myDate timeIntervalSinceNow] berguna, mereka mungkin menemukannya di sini.
sumber
timeIntervalSinceNow
seperti yang dibahas dalam banyak posting lainnya. Juga menangani perbandingan hari dengan memeriksa detik mendorong divisi rawan kesalahan oleh 86400.Ekstensi Swift berdasarkan jawaban terbaik:
sumber
Jika Anda memiliki banyak perbandingan tanggal ini, maka panggilan ke
calendar:components:fromDate
mulai memakan banyak waktu. Menurut beberapa profil yang telah saya lakukan, harganya agak mahal.Katakanlah Anda mencoba menentukan yang dari beberapa tanggal, katakanlah
NSArray *datesToCompare
, adalah hari yang sama dengan hari tertentu, katakanlahNSDate *baseDate
, maka Anda dapat menggunakan sesuatu seperti yang berikut (sebagian diadaptasi dari jawaban di atas):Keluaran:
sumber
Ada cara yang lebih mudah daripada banyak jawaban di atas!
sumber
Ini mungkin dapat dikerjakan ulang sebagai kategori NSDate, tetapi saya menggunakan:
(Namun, membandingkan dua string tanggal seperti dalam pertanyaan asli hampir terasa 'bersih' ..)
sumber
comps
saat Anda langsung mengaturnya ke nol? Juga, saya pikir Anda perlu memasukkan era.untuk iOS7 dan sebelumnya:
sumber
Lihat Erica Sadun kami yang hebat
NSDate extension
. Sangat mudah digunakan. Baik di sini:http://github.com/erica/NSDate-Extensions
Sudah ada di pos ini: https://stackoverflow.com/a/4052798/362310
sumber
Solusi yang benar dan aman tanpa membuka paksa, bekerja pada Swift 2.2 dan sebelum iOS 8:
sumber
Inilah jawaban 2 sen saya untuk membangun jawaban yang diterima tetapi juga mendukung API yang lebih baru. Catatan: Saya menggunakan kalender Gregorian karena sebagian besar perangko waktu adalah GMT tetapi ubah milik Anda sesuai keinginan Anda
sumber
Solusi saya adalah menghitung berapa hari berlalu sejak 1970 oleh divisi dan membandingkan bagian integer
sumber
sumber