Bagaimana saya bisa mendapatkan tahun / bulan / hari suatu NSDate
objek, tidak diberi informasi lain? Saya menyadari bahwa saya mungkin bisa melakukan ini dengan sesuatu yang mirip dengan ini:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Tapi itu tampaknya menjadi banyak kerumitan untuk sesuatu yang sederhana seperti mendapatkan NSDate
tahun / bulan / hari. Apakah ada solusi yang lain?
objective-c
nsdate
nsdatecomponents
nscalendar
Richard J. Ross III
sumber
sumber
Jawaban:
Karena ini rupanya jawaban saya yang paling populer, saya akan mencoba mengeditnya agar mengandung sedikit lebih banyak informasi.
Terlepas dari namanya,
NSDate
dalam dan dari dirinya sendiri hanya menandai suatu titik dalam waktu mesin, bukan tanggal. Tidak ada korelasi antara titik waktu yang ditentukan oleh satuNSDate
dan satu tahun, bulan, atau hari. Untuk itu, Anda harus merujuk ke kalender. Setiap titik waktu akan mengembalikan informasi tanggal yang berbeda berdasarkan pada kalender apa yang Anda lihat (tanggal tidak sama dalam kalender Gregorian dan Yahudi, misalnya), dan sementara kalender Gregorian adalah kalender yang paling banyak digunakan di dunia - saya berasumsi - kita sedikit bias yangNSDate
harus selalu menggunakannya.NSDate
, untungnya, jauh lebih bipartisan.Mendapatkan tanggal dan waktu harus melalui
NSCalendar
, seperti yang Anda sebutkan, tetapi ada cara yang lebih sederhana untuk melakukannya:Itu menghasilkan
NSDateComponents
objek yang berisi hari, bulan, dan tahun dari kalender sistem saat ini untuk hari ini. ( Catatan: ini belum tentu kalender yang ditentukan pengguna saat ini , hanya kalender sistem default.)Tentu saja, jika Anda menggunakan kalender atau tanggal yang berbeda, Anda dapat dengan mudah mengubahnya. Daftar unit kalender dan kalender yang tersedia dapat ditemukan di
NSCalendar
Referensi Kelas . Informasi lebih lanjut tentangNSDateComponents
ini dapat ditemukan diNSDateComponents
Referensi Kelas .Untuk referensi, mengakses komponen individu dari
NSDateComponents
agak mudah:Anda hanya harus berhati-hati:
NSDateComponents
tidak akan berisi informasi yang valid untuk bidang apa pun yang Anda minta kecuali Anda membuat mereka dengan informasi yang valid (yaitu permintaanNSCalendar
untuk memberikan informasi itu denganNSCalendarUnit
s).NSDateComponents
tidak mengandung informasi referensi di dalam dan tentang diri mereka sendiri - mereka hanya struktur sederhana yang menyimpan angka untuk Anda akses. Jika Anda ingin mendapatkan era, misalnya, dariNSDateComponents
, Anda harus memberi makan metode generator dariNSCalendar
denganNSCalendarUnitEra
bendera.sumber
NSCalendar
's+currentCalendar
metode akan mengembalikan kalender sistem, dan jadi jika telepon pengguna diatur ke mode Jepang atau Thailand waktu, Anda akan mendapatkan tahun yang berbeda. Jika Anda ingin memaksakan sistem kalender tertentu, buat kalender dan inisialisasi dengan lokal yang tepat. Misalnya, untuk memaksakan kalender Gregorian, Anda harus menggunakan yang berikut ini:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
Anda bisa mendapatkan komponen terpisah dari NSDate menggunakan NSDateFormatter:
Jika Anda ingin mendapatkan nomor bulan alih-alih singkatan, gunakan "MM". Jika Anda ingin mendapatkan bilangan bulat, gunakan
[myDayString intValue];
sumber
Hanya untuk menulis ulang kode Itai yang sangat baik (dan berfungsi!), Inilah yang akan terlihat seperti contoh kelas pembantu, untuk mengembalikan nilai tahun dari variabel NSDate yang diberikan.
Seperti yang Anda lihat, cukup mudah untuk memodifikasi kode ini untuk mendapatkan bulan atau hari.
(Saya tidak percaya kami harus menulis fungsi tanggal iOS dasar kami sendiri seperti ini, pada 2013 ...)
Satu hal lagi: jangan pernah gunakan <dan> untuk membandingkan dua nilai NSDate.
XCode akan dengan senang hati menerima kode tersebut (tanpa kesalahan atau peringatan), tetapi hasilnya lotere. Anda harus menggunakan fungsi "bandingkan" untuk membandingkan NSDates:
sumber
Dalam Swift 2.0:
sumber
Saya menulis jawaban ini karena itu satu-satunya pendekatan yang tidak memberi Anda opsional kembali dari
NSDateComponent
variabel dan / atau memaksa membuka bungkus variabel tersebut (juga untuk Swift 3).Cepat 3
Cepat 2
Bonus versi menyenangkan Swift 3
sumber
Baru di iOS 8
ObjC
Cepat
sumber
Jika Anda menargetkan iOS 8+ Anda dapat menggunakan yang baru
NSCalendar
metode kenyamanan untuk mencapai ini dalam format yang lebih singkat.Pertama buat
NSCalendar
dan gunakan apa punNSDate
yang diperlukan.Anda dapat mengekstrak komponen satu per satu melalui
component:fromDate:
Atau, bahkan lebih ringkas, gunakan
NSInteger
pointer melaluigetEra:year:month:day:fromDate:
Untuk informasi dan contoh lebih lanjut, lihat Manipulasi NSDate yang Dibuat Mudah di iOS 8 . Penafian, saya menulis posting.
sumber
Pada iOS 8.0 (dan OS X 10) Anda dapat menggunakan metode komponen untuk menyederhanakan mendapatkan komponen kencan tunggal seperti:
Seharusnya membuat semuanya lebih sederhana dan mudah-mudahan ini diterapkan secara efisien.
sumber
Jika Anda ingin mendapatkan NSDateComponents individu dari NSDate, Anda pasti membutuhkan solusi yang disarankan oleh Itai Ferber. Tetapi jika Anda ingin pergi dari NSDate langsung ke NSString, Anda dapat menggunakan NSDateFormatter .
sumber
sumber
Inilah solusinya di Swift:
sumber
Coba ini . . .
Cuplikan kode:
Ini memberikan tahun, bulan, tanggal saat ini
sumber
Coba yang berikut ini:
sumber
Swift 2.x
Anda dapat menggunakannya sebagai
Keluaran
sumber
Cepat
Cara yang lebih mudah untuk mendapatkan elemen tanggal sebagai String opsional.
sumber
saya lakukan dengan cara ini ....
sumber
Untuk mendapatkan string yang dapat dibaca manusia (hari, bulan, tahun), Anda dapat melakukan:
sumber