Swift memiliki Datetipe sendiri . Tidak perlu digunakan NSDate.
Membuat Tanggal dan Waktu dalam Swift
Di Swift, tanggal dan waktu disimpan dalam angka floating point 64-bit yang mengukur jumlah detik sejak tanggal referensi 1 Januari 2001 pukul 00:00:00 UTC . Ini diungkapkan dalam Datestruktur . Berikut ini akan memberi Anda tanggal dan waktu saat ini:
let currentDateTime =Date()
Untuk membuat tanggal-waktu lainnya, Anda dapat menggunakan salah satu metode berikut.
Metode 1
Jika Anda tahu jumlah detik sebelum atau setelah tanggal referensi 2001, Anda dapat menggunakannya.
let someDateTime =Date(timeIntervalSinceReferenceDate:-123456789.0)//Feb2,1997,10:26 AM
Metode 2
Tentu saja, akan lebih mudah untuk menggunakan hal-hal seperti tahun, bulan, hari dan jam (daripada detik relatif) untuk membuat Date. Untuk ini, Anda dapat menggunakan DateComponentsuntuk menentukan komponen dan kemudian Calendaruntuk membuat tanggal. The Calendarmemberikan Datekonteks. Kalau tidak, bagaimana ia bisa tahu zona waktu atau kalender mana untuk mengekspresikannya?
// Specify date components
var dateComponents =DateComponents()
dateComponents.year =1980
dateComponents.month =7
dateComponents.day =11
dateComponents.timeZone =TimeZone(abbreviation:"JST")// Japan Standard Time
dateComponents.hour =8
dateComponents.minute =34// Create date from components
let userCalendar =Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)
Singkatan zona waktu lainnya dapat ditemukan di sini . Jika Anda membiarkannya kosong, maka defaultnya adalah menggunakan zona waktu pengguna.
Metode 3
Cara yang paling ringkas (tapi belum tentu yang terbaik) bisa digunakan DateFormatter.
let formatter =DateFormatter()
formatter.dateFormat ="yyyy/MM/dd HH:mm"let someDateTime = formatter.date(from:"2016/10/08 22:31")
Sekarang Anda dapat membuat NSDate dari Swift hanya dengan melakukan:
NSDate(dateString:"2014-06-06")
Harap dicatat bahwa implementasi ini tidak menembolok NSDateFormatter, yang mungkin ingin Anda lakukan karena alasan kinerja jika Anda berharap akan membuat banyak NSDatedengan cara ini.
Harap perhatikan juga bahwa implementasi ini hanya akan lumpuh jika Anda mencoba menginisialisasi NSDatedengan meneruskan string yang tidak dapat diuraikan dengan benar. Ini karena pembongkaran paksa nilai opsional yang dikembalikan oleh dateFromString. Jika Anda ingin mengembalikan nilparse buruk, Anda idealnya menggunakan inisialisasi yang gagal; tetapi Anda tidak dapat melakukannya sekarang (Juni 2015), karena keterbatasan dalam Swift 1.2, maka Anda pilihan terbaik berikutnya adalah menggunakan metode pabrik kelas.
Ini menunjukkan bahwa ekstensi menyediakan inisialisasi yang sebenarnya mendelegasikan inisialisasi ke inisialisasi yang sudah ada, yang dalam hal ini adalah NSDate.init (timeInterval:, sinceDate :) initializer. Ini dijelaskan di halaman 275 dari buku Bahasa Swift Programming.
algal
1
Satu kekurangan yang saya lihat dalam kode di atas adalah menciptakan kembali NSDateFormattersetiap kali fungsi diakses. Seperti yang dinyatakan dalam Panduan Pemformatan Tanggal Membuat formatter tanggal bukanlah operasi yang murah . Juga, kelas ini aman karena iOS7, sehingga orang dapat menggunakannya dengan aman untuk semua NSDateekstensi.
Yevhen Dubinin
@ eugenedubinin benar. itu sebabnya saya berkata "implementasi ini tidak men-cache NSDateFormatter, yang mungkin ingin Anda lakukan karena alasan kinerja".
Swift tidak memiliki jenis Tanggal sendiri, tetapi Anda harus menggunakan NSDatejenis Kakao yang ada , misalnya:
classDate{classfunc from(year:Int, month:Int, day:Int)->Date{let gregorianCalendar =NSCalendar(calendarIdentifier:.gregorian)!var dateComponents =DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = day
let date = gregorianCalendar.date(from: dateComponents)!return date
}classfunc parse(_ string:String, format:String="yyyy-MM-dd")->Date{let dateFormatter =DateFormatter()
dateFormatter.timeZone =NSTimeZone.default
dateFormatter.dateFormat = format
let date = dateFormatter.date(from: string)!return date
}}
Yang bisa Anda gunakan seperti:
var date =Date.parse("2014-05-20")var date =Date.from(year:2014, month:05, day:20)
Saya harus mengubah baris: var date = gregorian? .DateFromComponents (c) tapi saya tidak mengerti mengapa, dan parse return dateFmt.dateFromString juga mengeluh. Ada petunjuk? Ah, saya telah mengubah jenis fungsi kembali dari NSDate ke NSDate? yang memungkinkannya dikompilasi. Tapi saya tidak yakin mengapa itu harus dibatalkan.
Senator
1
@TheSenator NSCalendar init mengembalikan opsional (?) Jadi gregorian adalah opsional (?). Mengakses kebutuhan opsional ke Chaining opsional untuk mengaksesnya dengan begitu asli? .DateFromCoomponents adalah Chaining opsional untuk membuka nilai dari opsi gregorian (NSCalendar). Lebih banyak untuk
rangkaian
NSGregorianCalendar sudah tidak digunakan lagi di iOS 8 jadi gunakan NSCalendarIdentifierGregorian sebagai gantinya
Adam Knights
2
@The Senator Complains karena Swift memiliki struct Tanggal, dan kode ini mendeklarasikan Tanggal kembali sebagai kelas. Jadi Anda harus melakukan sesuatu seperti: 'extension Date' dan 'static func'
Zaporozhchenko Oleksandr
Memo tentang string parse kembali ke Date. Sebuah string "1979-07-01" "dengan" yyyy-MM-dd "untuk NSDateFormattermetode date(from:). Ia kembali nil. Saya menemukan masalah ini di log crash fabric.io.
AechoLiu
12
Inilah cara saya melakukannya di Swift 4.2:
extensionDate{/// Create a date from specified parameters
///
/// - Parameters:
/// - year: The desired year
/// - month: The desired month
/// - day: The desired day
/// - Returns: A `Date` object
staticfunc from(year:Int, month:Int, day:Int)->Date?{let calendar =Calendar(identifier:.gregorian)var dateComponents =DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = day
return calendar.date(from: dateComponents)??nil}}
Pemakaian:
let marsOpportunityLaunchDate =Date.from(year:2003, month:07, day:07)
Membuat formatter tanggal bukanlah operasi yang murah. Jika Anda cenderung sering menggunakan formatter, biasanya lebih efisien untuk melakukan cache satu instance daripada membuat dan membuang beberapa instance. Salah satu pendekatan adalah menggunakan variabel statis
Dan sementara saya setuju dengan @Leon bahwa ini harus menjadi inisialisasi failable, ketika Anda memasukkan data seed, kita bisa memiliki satu yang tidak tersedia (seperti ada UIImage(imageLiteralResourceName:) ).
NSDate
seperti di Objective-C?Jawaban:
Swift memiliki
Date
tipe sendiri . Tidak perlu digunakanNSDate
.Membuat Tanggal dan Waktu dalam Swift
Di Swift, tanggal dan waktu disimpan dalam angka floating point 64-bit yang mengukur jumlah detik sejak tanggal referensi 1 Januari 2001 pukul 00:00:00 UTC . Ini diungkapkan dalam
Date
struktur . Berikut ini akan memberi Anda tanggal dan waktu saat ini:Untuk membuat tanggal-waktu lainnya, Anda dapat menggunakan salah satu metode berikut.
Metode 1
Jika Anda tahu jumlah detik sebelum atau setelah tanggal referensi 2001, Anda dapat menggunakannya.
Metode 2
Tentu saja, akan lebih mudah untuk menggunakan hal-hal seperti tahun, bulan, hari dan jam (daripada detik relatif) untuk membuat
Date
. Untuk ini, Anda dapat menggunakanDateComponents
untuk menentukan komponen dan kemudianCalendar
untuk membuat tanggal. TheCalendar
memberikanDate
konteks. Kalau tidak, bagaimana ia bisa tahu zona waktu atau kalender mana untuk mengekspresikannya?Singkatan zona waktu lainnya dapat ditemukan di sini . Jika Anda membiarkannya kosong, maka defaultnya adalah menggunakan zona waktu pengguna.
Metode 3
Cara yang paling ringkas (tapi belum tentu yang terbaik) bisa digunakan
DateFormatter
.Standar teknis Unicode menunjukkan format lain yang
DateFormatter
mendukung.Catatan
Lihat jawaban lengkap saya untuk cara menampilkan tanggal dan waktu dalam format yang dapat dibaca. Baca juga artikel-artikel hebat ini:
sumber
Ini paling baik dilakukan dengan menggunakan ekstensi ke
NSDate
kelas yang ada .Ekstensi berikut menambahkan inisialisasi baru yang akan membuat tanggal di lokal saat ini menggunakan string tanggal dalam format yang Anda tentukan.
Sekarang Anda dapat membuat NSDate dari Swift hanya dengan melakukan:
Harap dicatat bahwa implementasi ini tidak menembolok NSDateFormatter, yang mungkin ingin Anda lakukan karena alasan kinerja jika Anda berharap akan membuat banyak
NSDate
dengan cara ini.Harap perhatikan juga bahwa implementasi ini hanya akan lumpuh jika Anda mencoba menginisialisasi
NSDate
dengan meneruskan string yang tidak dapat diuraikan dengan benar. Ini karena pembongkaran paksa nilai opsional yang dikembalikan olehdateFromString
. Jika Anda ingin mengembalikannil
parse buruk, Anda idealnya menggunakan inisialisasi yang gagal; tetapi Anda tidak dapat melakukannya sekarang (Juni 2015), karena keterbatasan dalam Swift 1.2, maka Anda pilihan terbaik berikutnya adalah menggunakan metode pabrik kelas.Contoh yang lebih terperinci, yang membahas kedua masalah, ada di sini: https://gist.github.com/algal/09b08515460b7bd229fa .
Pembaruan untuk Swift 5
sumber
NSDateFormatter
setiap kali fungsi diakses. Seperti yang dinyatakan dalam Panduan Pemformatan Tanggal Membuat formatter tanggal bukanlah operasi yang murah . Juga, kelas ini aman karena iOS7, sehingga orang dapat menggunakannya dengan aman untuk semuaNSDate
ekstensi.Swift tidak memiliki jenis Tanggal sendiri, tetapi Anda harus menggunakan
NSDate
jenis Kakao yang ada , misalnya:Yang bisa Anda gunakan seperti:
sumber
NSDateFormatter
metodedate(from:)
. Ia kembalinil
. Saya menemukan masalah ini di log crash fabric.io.Inilah cara saya melakukannya di Swift 4.2:
Pemakaian:
sumber
dateComponents
Berdasarkan dokumentasi Apple
Contoh:
sumber
Di, Swift 3.0 Anda telah menetapkan objek tanggal untuk cara ini.
sumber
Secara pribadi saya pikir itu harus menjadi inisialisasi yang tersedia:
Kalau tidak, string dengan format yang tidak valid akan memunculkan eksepsi.
sumber
Menurut jawaban @mythz, saya memutuskan untuk mengirim versi terbaru ekstensi menggunakan
swift3
sintaks.Saya tidak menggunakan
parse
metode, tetapi jika seseorang membutuhkan, saya akan memperbarui posting ini.sumber
Saya sering harus menggabungkan nilai tanggal dari satu tempat dengan nilai waktu untuk yang lain. Saya menulis fungsi pembantu untuk mencapai ini.
sumber
Menurut Panduan Pemformatan Data Apple
Dan sementara saya setuju dengan @Leon bahwa ini harus menjadi inisialisasi failable, ketika Anda memasukkan data seed, kita bisa memiliki satu yang tidak tersedia (seperti ada
UIImage(imageLiteralResourceName:)
).Jadi, inilah pendekatan saya:
Dan sekarang nikmati hanya menelepon:
sumber