Konversi string ke tanggal di Swift

136

Bagaimana saya bisa mengubah string ini "2016-04-14T10:44:00+0000"menjadi NSDatedan hanya menyimpan tahun, bulan, hari, jam?

Di Ttengah-tengahnya benar-benar membuang apa yang saya terbiasa ketika bekerja dengan teman kencan.

asheyla
sumber
Anda ingin Tahun, bulan, hari, jam, kan?
Mitul Marsoniya
Kemungkinan duplikat Dari String ke NSDate di Swift
Fogmeister

Jawaban:

231
  • Konversi string ISO8601 ke tanggal

    let isoDate = "2016-04-14T10:44:00+0000"
    
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!
  • Dapatkan komponen tanggal untuk tahun, bulan, hari dan jam dari tanggal

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
  • Terakhir, buat Dateobjek baru dan hapus menit dan detik

    let finalDate = calendar.date(from:components)

Pertimbangkan juga formatter kenyamanan yang ISO8601DateFormatterdiperkenalkan di iOS 10 / macOS 12:

let isoDate = "2016-04-14T10:44:00+0000"

let dateFormatter = ISO8601DateFormatter()
let date = dateFormatter.date(from:isoDate)!
Vadian
sumber
3
Z dalam "yyyy-MM-dd'T'HH: mm: ssZ" memecahkan apa yang tidak bekerja untuk saya
asheyla
Saya hanya ingin tahun dan hari, tetapi ini tidak bekerja untuk saya
Sneha
@Sneha Jika Anda tidak ingin jam hanya .hour
dihilangkan
@vadian saya lakukan tetapi saya tidak mendapatkan
Sneha
1
Semua dalam satu: ISO8601DateFormatter (). Date (from: "your string")!
Mike Irving
38

Coba Format tanggal berikut.

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter. dateFromString (strDate)

Semoga ini bisa membantu ..

Swift 4.1:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter.date(from: strDate)
Balaji Ramakrishnan
sumber
10
Mencobanya, dan tanggal kembali nol setelah ini.
asheyla
1
Tidak dapat mengonversi nilai dari tipe 'String' ke tipe 'Date' di paksaan
Oleksandr
22

Di Swift 4.1 Anda dapat melakukan:

func getDate() -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.locale = Locale.current
    return dateFormatter.date(from: "2015-04-01T11:42:00") // replace Date String
}
Paul Spiesberger
sumber
16

Swift 3.0 - 4.2

import Foundation

extension String {

    func toDate(withFormat format: String = "yyyy-MM-dd HH:mm:ss")-> Date?{

        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.calendar = Calendar(identifier: .gregorian)
        dateFormatter.dateFormat = format
        let date = dateFormatter.date(from: self)

        return date

    }
}

extension Date {

    func toString(withFormat format: String = "EEEE ، d MMMM yyyy") -> String {

        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.calendar = Calendar(identifier: .persian)
        dateFormatter.dateFormat = format
        let str = dateFormatter.string(from: self)

        return str
    }
}
Mohammad Razipour
sumber
9

Hai Anda memiliki T Format yang terpisah dan kemudian mengonversi sesuka Anda

// create dateFormatter with UTC time format
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date = dateFormatter.dateFromString("2015-04-01T11:42:00")

// change to a readable time format and change to local time zone
dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a"
dateFormatter.timeZone = NSTimeZone.localTimeZone() 
let timeStamp = dateFormatter.stringFromDate(date!)
Arun
sumber
6

Hanya melewati Anda dateformatedan teman kencan Anda maka Anda dapatkan Year,month,day,hour. Informasi tambahan

func GetOnlyDateMonthYearFromFullDate(currentDateFormate:NSString , conVertFormate:NSString , convertDate:NSString ) -> NSString
    {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = currentDateFormate as String
        let formatter = NSDateFormatter()
        formatter.dateFormat = Key_DATE_FORMATE as String
        let finalDate = formatter.dateFromString(convertDate as String)
        formatter.dateFormat = conVertFormate as String
        let dateString = formatter.stringFromDate(finalDate!)

        return dateString
    }


Dapatkan Tahun

let Year = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "YYYY", convertDate: "2016-04-14T10:44:00+0000") as String


Dapatkan Bulan

let month = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "MM", convertDate: "2016-04-14T10:44:00+0000") as String


Dapatkan Hari

let day = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "dd", convertDate: "2016-04-14T10:44:00+0000") as String


Dapatkan Jam

let hour  = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "hh", convertDate: "2016-04-14T10:44:00+0000") as String
Mitul Marsoniya
sumber
4

membuat fungsi global

func convertDateFormat(inputDate: String) -> String {

     let olDateFormatter = DateFormatter()
     olDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

     let oldDate = olDateFormatter.date(from: inputDate)

     let convertDateFormatter = DateFormatter()
     convertDateFormatter.dateFormat = "MMM dd yyyy h:mm a"

     return convertDateFormatter.string(from: oldDate!)
}

Memanggil fungsi dan memberikan nilai di dalamnya

get_OutputStr = convertDateFormat(inputDate: "2019-03-30T05:30:00+0000")

dan di sini adalah output

Feb 25 2020 4:51 PM



 
Narendra Jagne
sumber
1
Apakah Anda pikir input dan output Anda sama?
Deepak Carpenter
2

Di swift4,

    var Msg_Date_ = "2019-03-30T05:30:00+0000"

    let dateFormatterGet = DateFormatter()
    dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    let dateFormatterPrint = DateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd yyyy h:mm a"  //"MMM d, h:mm a" for  Sep 12, 2:11 PM
    let datee = dateFormatterGet.date(from: Msg_Date_)
    Msg_Date_ =  dateFormatterPrint.string(from: datee ?? Date())

    print(Msg_Date_)

// output: - 30 Mar 2019 05:30 PM

Fuhad saneen
sumber
2

cukup Langkah 1> dapatkan nilai String dari JSON atau dataSource

Langkah 2> buat variabel lokal dan tetapkan.

let startDate = CurrentDashBoard.startdate

Langkah 3> buat instance DateFormatter.

let dateFormatter = DateFormatter()

langkah 4> panggil dateFormat dari dateFormatter dan berikan tipe data tanggal yang disimpan.

dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss"("may be String formate")

langkah 5> Tetapkan variabel Lokal ke variabel ini untuk dikonversi.

let dateFromStringstartDate : NSDate = dateFormatter.date(from: startDate)! as NSDate

Langkah 6> berikan Tanggal yang Anda inginkan, Formate dengan kode berikut.

dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"

Langkah 6> Tetapkan ke label / teks

cell.lblStartDate.text = String(format: "%@", strstartDate)

Kode:

let startDate = CurrentDashBoard.startdate let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss" let dateFromStringstartDate : 
NSDate = dateFormatter.date(from: startDate)! as NSDate
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"
let strstartDate = dateFormatter.string(from: dateFromStringstartDate as Date)
Akshay K
sumber
1

Swift 5. Untuk melihat JIKA TANGGAL TELAH BERLALU:

let expiryDate = "2020-01-10" // Jan 10 2020

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

if Date() < dateFormatter.date(from: expiryDate) ?? Date() {
    print("Not Yet expiryDate")
} else {
    print("expiryDate has passed")
}
Thyselius
sumber
1

Saya jadi gila dengan format ini juga.

Lihat solusinya di bawah ini.

String Anda yang datang dari belakang atau sumber lain:

    let isoDate = "2020-05-06 20:00:00-03"

Identifikasi format tanggal

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!

Sekarang Anda memiliki tanggal sebagai Tanggal (), Anda dapat mengubah ke format apa pun yang Anda inginkan menggunakan formatDate.string

    let formatDate = DateFormatter()
    formatDate.dateFormat = "dd/MM/yyyy HH:mm"
    let drawDate = formatDate.string(from: date)
    print(drawDate)

Keluaran:

    06/05/2020 20:00
Alan Silva
sumber
0

Silakan gunakan perpustakaan parsing ISO8601 untuk melakukan ini. Ada terlalu banyak cara bagaimana string dapat dikodekan. Jangan mengandalkan format tertentu dan jangan bergantung pada pengiriman server yang selalu sama. Masalahnya dimulai dengan 'Z' di bagian akhir dan itu akan meluas melalui semua varietas standar. Parsing perpustakaan akan menangani semua kasus dan akan selalu memberikan konversi yang aman - sedangkan string pemformatan tetap cenderung gagal di masa mendatang.

Anda bisa menggunakan salah satu perpustakaan ini. Mereka juga tersedia di CococaPods:

https://github.com/boredzo/iso-8601-date-formatter/

https://github.com/malcommac/SwiftDate

Lihatlah implementasinya. Keduanya panjang beberapa ratus baris - untuk alasan yang baik.

Berkenaan dengan pertanyaan: Anda dapat menarik komponen tanggal dari tanggal menggunakan NSDateComponents. Contoh di situs web mencakup persis kasus Anda.

https://developer.apple.com/documentation/foundation/nscalendar/1414841-components?language=objc

Perlu diketahui, bahwa mengonversi tanggal Anda akan mempertimbangkan zona waktu. Anda mungkin ingin mengatur 'lokal' dari NSCalendar secara eksplisit.

terima kasih
sumber
0

Cukup gunakan SwifterSwift.

stringDate = "2020-04-26T08:56:17.987Z"
let date = Date(iso8601String: stringDate)
LeoNard
sumber