Cukup mudah untuk mendapatkan string tanggal ISO 8601 (misalnya, 2004-02-12T15:19:21+00:00
) dalam PHP melalui date('c')
, tetapi bagaimana cara mendapatkannya di Objective-C (iPhone)? Apakah ada cara singkat yang serupa untuk melakukannya?
Inilah cara lama saya melakukannya:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
Tampaknya terlalu banyak omong kosong untuk sesuatu yang begitu sentral.
ios
nsdate
nsdateformatter
iso8601
JohnK
sumber
sumber
Jawaban:
Penggunaan
NSDateFormatter
:Dan di Swift:
sumber
setLocale
penting?iOS 10 memperkenalkan
NSISO8601DateFormatter
kelas baru untuk menangani hal ini. Jika Anda menggunakan Swift 3, kode Anda akan menjadi seperti ini:sumber
string
berisi "2016-09-03T21: 47: 27Z".Sebagai pelengkap jawaban maddy, format zona waktu harus "ZZZZZ" (5 kali Z) untuk ISO 8601, bukan "Z" tunggal (yang untuk format RFC 822). Setidaknya di iOS 6.
(lihat http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns )
sumber
Masalah yang sering diabaikan adalah string dalam format ISO 8601 mungkin memiliki milidetik dan mungkin juga tidak.
Dengan kata lain, "2016-12-31T23: 59: 59.9999999" dan "2016-12-01T00: 00: 00" adalah sah, tetapi jika Anda menggunakan formatter tanggal yang diketik statis, salah satunya tidak akan diurai .
Mulai dari iOS 10, Anda harus menggunakan
ISO8601DateFormatter
yang menangani semua variasi string tanggal ISO 8601. Lihat contoh di bawah ini:Untuk iOS 9 dan yang lebih lama, gunakan pendekatan berikut dengan beberapa pemformat data.
Saya belum menemukan jawaban yang mencakup kedua kasus dan mengaburkan perbedaan halus ini. Inilah solusi yang mengatasinya:
Pemakaian:
Saya juga merekomendasikan untuk memeriksa artikel Apple tentang format tanggal.
sumber
Jadi gunakan kategori Sam Soffee di NSDate yang ditemukan di sini . Dengan kode itu ditambahkan ke proyek Anda, Anda dapat sejak saat itu menggunakan satu metode di NSDate:
Tidak hanya satu baris, ini jauh lebih cepat daripada pendekatan NSDateFormatter, karena ditulis dalam C murni.
sumber
Dari IS8601 , masalahnya adalah representasi dan zona waktu
year-month-day time timezone
T
Berikut beberapa string yang valid
Solusi
NSDateFormatter
Jadi, inilah format yang saya gunakan di onmyway133 ISO8601
Tentang
Z
pengidentifikasi Tabel Simbol Bidang TanggalTentang
locale
Memformat Data Menggunakan Pengaturan LokalTentang
en_US_POSIX
Tanya Jawab Teknis QA1480 NSDateFormatter dan Tanggal InternetQuetions terkait yang menarik
sumber
Cukup gunakan NSISO8601DateFormatter dari framework Foundation.
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
sumber
Berdasarkan inti ini: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift , metode berikut dapat digunakan untuk mengonversi NSDate ke string tanggal ISO 8601 dalam format yyyy-MM -dd'T'HH: mm: ss.SSSZ
sumber
S
untuk sub-detik adalah kuncinya di siniIni sedikit lebih sederhana dan memasukkan tanggal ke dalam UTC.
sumber
Menggunakan Swift 3.0 dan iOS 9.0
sumber