Saya bertanya-tanya apakah ada kemungkinan baru dan mengagumkan untuk mendapatkan jumlah hari antara dua NSDates di Swift / Cocoa "baru"?
Misalnya seperti di Ruby saya akan melakukan:
(end_date - start_date).to_i
ios
swift
date
date-difference
Linus
sumber
sumber
Jawaban:
Anda juga harus mempertimbangkan perbedaan waktu. Misalnya jika Anda membandingkan tanggal
2015-01-01 10:00
dan2015-01-02 09:00
, hari-hari di antara tanggal tersebut akan kembali sebagai 0 (nol) karena perbedaan antara tanggal tersebut kurang dari 24 jam (itu 23 jam).Jika tujuan Anda adalah mendapatkan nomor hari yang tepat di antara dua tanggal, Anda dapat mengatasi masalah ini seperti ini:
Versi Swift 3 dan Swift 4
sumber
calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: firstDate))
startOfDay()
tampaknya tidak perlu):calendar.date(bySettingHour: 12, minute: 0, second: 0, of: firstDate)
.Inilah jawaban saya untuk Swift 2:
sumber
today
dantomorrow
Saya melihat beberapa jawaban Swift3 jadi saya akan menambahkan jawaban saya sendiri:
Penamaannya terasa lebih Swifty, satu baris, dan menggunakan
dateComponents()
metode terbaru .sumber
Saya menerjemahkan jawaban Objective-C saya
hasil
Bagian tersulit adalah bahwa pelengkapan otomatis menegaskan fromDate dan toDate akan
NSDate?
, tetapi memang harusNSDate!
seperti yang ditunjukkan dalam referensi.Saya tidak melihat bagaimana solusi yang baik dengan operator akan terlihat, karena Anda ingin menentukan unit secara berbeda di setiap kasus. Anda dapat mengembalikan interval waktu, tetapi Anda tidak mendapatkan banyak keuntungan.
sumber
.DayCalendarUnit
sudah usang. Saya percaya sekarang Anda harus menggunakan.CalendarUnitDay
sebagai gantinya.let components = cal.components(.Day, fromDate: startDate, toDate: endDate, options: [])
.Day
sekarangIni sangat bagus,
Date
perpanjangan untuk mendapatkan perbedaan antara tanggal dalam tahun, bulan, hari, jam, menit, detiksumber
date
harussinceDate
dalam parameter fungsi.days
dan berfungsi dengan baik.func years(since date: Date) -> Int? { return Calendar.current.dateComponents[.year], from: date, to: self).years }
, dan Anda bisa menyebutnya sebagailet y = date1.years(since: date2)
. Itu mungkin lebih konsisten dengan konvensi penamaan modern.Pembaruan untuk Swift 3 iOS 10 Beta 4
sumber
Inilah jawaban untuk Swift 3 (diuji untuk IOS 10 Beta)
Kemudian Anda bisa menyebutnya seperti ini
sumber
Swift 3. Terima kasih kepada Emin Buğra Saral di atas atas
startOfDay
sarannya.Pemakaian:
sumber
Hal-hal yang dibangun dengan cepat masih sangat mendasar. Seperti seharusnya pada tahap awal ini. Tetapi Anda dapat menambahkan barang Anda sendiri dengan risiko yang datang dengan operator yang membebani dan fungsi domain global. Mereka akan menjadi lokal untuk modul Anda.
sumber
Inilah jawaban saya untuk Swift 3:
sumber
Hampir tidak ada pustaka standar khusus Swift; hanya jenis numerik dasar, string, dan koleksi.
Sangat mungkin untuk mendefinisikan singkatan seperti itu menggunakan ekstensi, tetapi sejauh API out-of-the-box yang sebenarnya berjalan, tidak ada Cocoa "baru"; Swift hanya memetakan langsung ke API Kakao verbose lama yang sama seperti yang sudah ada.
sumber
Saya akan menambahkan versi saya meskipun utas ini berumur satu tahun. Kode saya terlihat seperti ini:
Saya harap ini membantu seseorang.
Bersulang,
sumber
Metode Erin diperbarui ke Swift 3, Ini menunjukkan hari dari hari ini (dengan mengabaikan waktu)
sumber
Ini mengembalikan perbedaan mutlak dalam hari antara beberapa
Date
dan hari ini:dan kemudian gunakan:
sumber
Anda dapat menggunakan ekstensi berikut:
Kemudian, Anda bisa menyebutnya seperti ini:
sumber
Swift 3.2.0
sumber
Semua jawaban bagus. Tetapi untuk Pelokalan kita perlu menghitung jumlah hari desimal di antara dua tanggal. sehingga kami dapat menyediakan format desimal berkelanjutan.
sumber
Lalu gunakan seperti itu
sumber
Ini adalah versi terbaru dari jawaban Emin untuk Swift 5 yang menggabungkan saran untuk menggunakan siang hari, bukan tengah malam sebagai waktu yang pasti untuk membandingkan hari. Ini juga menangani potensi kegagalan berbagai fungsi tanggal dengan mengembalikan opsional.
sumber
Swift 3 - Hari dari hari ini sampai saat ini
Fungsi panggilan seperti ini
sumber
pilihan yang lebih mudah adalah membuat ekstensi pada Tanggal
sumber
jika Anda membutuhkan hari bulan tahun dan jam sebagai string gunakan ini
var besok = Calendar.current.date (byAdding: .day, value: 1, to: Date ())!
biarkan dc = besok.completeOffset (dari: Tanggal ())
sumber
Satu kapal bagus yang berguna:
sumber
sumber
Solusi Swift 5.2.4:
sumber
Versi 2017, salin dan tempel
sumber
sumber