Bagaimana saya bisa mengubah tanggal string ke NSDate?

195

Saya ingin mengonversi "2014-07-15 06: 55: 14.198000 + 00: 00" tanggal string ini ke NSDate di Swift.

Shardul
sumber
Sepertinya string Anda "2014-07-15 06: 55: 14.198000 + 00: 00" tidak dapat dijangkau jika Anda menggunakan NSDateFormatter
Alex Peda
Sebagai sumber pendamping untuk semua jawaban di bawah ini, saya akan sangat menyarankan untuk memeriksa nsdateformatter.com
user3344977
Jawaban lama di sini benar-benar SALAH . Doco Apple mengatakan sangat jelas Anda perlu melakukan cache formatter. stackoverflow.com/a/42370648/294884
Fattie
Jika Anda membutuhkan penolong apa pun dengan format ini, nsdateformatter.com
Pedro Luz

Jawaban:

341

coba ini:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = /* find out and place date format from 
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
let date = dateFormatter.dateFromString(/* your_date_string */)

Untuk kueri lebih lanjut, periksa NSDateFormatter dan DateFormatter kelas kerangka kerja Foundation untuk Objective-C dan Swift, masing-masing.

Swift 3 dan yang lebih baru (Swift 4 termasuk)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = /* date_format_you_want_in_string from
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
guard let date = dateFormatter.date(from: /* your_date_string */) else {
   fatalError("ERROR: Date conversion failed due to mismatched format.")
}

// use date constant here
x4h1d
sumber
11
Ditemukan solusinya hanya perlu mengatur "yyyy-MM-dd hh: mm: ss.SSSSxxx" format tanggal ini
Shardul
1
Saya memiliki string tanggal seperti ini "2014-07-15 06: 55: 14-0400" dan saya mencoba menggunakan yyyy-MM-dd hh:mm:ssZZZ. Tapi saya tidak bisa mengeluarkan objek tanggal dari string.
iamprem
2
@ Prim, jika Anda melihat hasilnya adalah "2014-07-15 10:55:14 +0000"yang benar. Seperti dari NSDatedeskripsi, output tanggal akan dihitung dengan perbedaan (di sini, GMT -4 jam). Jika Anda ingin mendapatkan perbedaan antara GMT dan UTC, yang -0400memeriksa referensi
x4h1d
@ x4h1d, Hei, saya mengerti! Saya membuat kesalahan di hhmana seharusnya HH. Terima kasih!
iamprem
3
@ lmiguelvargasf, saya pikir itu akan terjadi yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Saya berasumsi Zhanya karakter di sini. Ingat, Zpunya makna khusus juga. Jika Anda ingin Zmenentukan basic hmsformatnya yyyy-MM-dd'T'HH:mm:ss.SSSZ.
x4h1d
71

Cepat 4

import Foundation

let dateString = "2014-07-15" // change to your date format

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

let date = dateFormatter.date(from: dateString)
println(date)

Cepat 3

import Foundation

var dateString = "2014-07-15" // change to your date format

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

var date = dateFormatter.dateFromString(dateString)
println(date)

Saya bisa melakukannya dengan kode ini.

Kiattisak Anoochitarom
sumber
5
Kode tidak benar. Ini menampilkan Some "15 Jan 2014, 12:00 AM"
Jake Lin
5
menggunakan ddbukannya DDseharusnya membantu memperbaiki masalah "selalu Januari".
Pascal Belloncle
1
Versi yang benar adalah, yyyy-MM-ddjika tidak, tanggal yang diuraikan macet pada bulan Januari - Saya memperbarui jawaban untuk mencerminkan perubahan.
Zorayr
Bagaimana jika saya ingin melewatkan tanggal saat ini sebagai string. Akankah ini berhasil?
Arjun Kalidas
@Zorayr, Kittisak: Saya mendapatkan put out, Opsional (2014-07-14 18:30:00 +0000) itu artinya, satu hari dikurangi. Bagaimana saya bisa memperbaikinya?
Vineesh TP
54
 func convertDateFormatter(date: String) -> String
 {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let date = dateFormatter.dateFromString(date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let timeStamp = dateFormatter.stringFromDate(date!)


    return timeStamp
}

Diperbarui untuk Swift 3.

func convertDateFormatter(date: String) -> String
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let date = dateFormatter.date(from: date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: date!)


    return timeStamp
}
idris yıldız
sumber
17

Detail

  • Swift 4, Xcode 9.2
  • Swift 5, Xcode 10.2 (10E125)

Larutan

import Foundation

extension DateFormatter {

    convenience init (format: String) {
        self.init()
        dateFormat = format
        locale = Locale.current
    }
}

extension String {

    func toDate (dateFormatter: DateFormatter) -> Date? {
        return dateFormatter.date(from: self)
    }

    func toDateString (dateFormatter: DateFormatter, outputFormat: String) -> String? {
        guard let date = toDate(dateFormatter: dateFormatter) else { return nil }
        return DateFormatter(format: outputFormat).string(from: date)
    }
}

extension Date {

    func toString (dateFormatter: DateFormatter) -> String? {
        return dateFormatter.string(from: self)
    }
}

Pemakaian

var dateString = "14.01.2017T14:54:00"
let dateFormatter = DateFormatter(format: "dd.MM.yyyy'T'HH:mm:ss")
let date = Date()

print("original String with date:               \(dateString)")
print("date String() to Date():                 \(dateString.toDate(dateFormatter: dateFormatter)!)")
print("date String() to formated date String(): \(dateString.toDateString(dateFormatter: dateFormatter, outputFormat: "dd MMMM")!)")
let dateFormatter2 = DateFormatter(format: "dd MMM HH:mm")
print("format Date():                           \(date.toString(dateFormatter: dateFormatter2)!)")

Hasil

masukkan deskripsi gambar di sini

Informasi lebih lanjut

Tentang format tanggal

Bodnarchuk dengan mudah
sumber
15

Jika Anda perlu sering menguraikan string ke dalam tanggal, Anda mungkin ingin memindahkan fungsionalitas ke ekstensi. Saya membuat file sharedCode.swift dan meletakkan ekstensi saya di sana:

extension String
{   
    func toDateTime() -> NSDate
    {
        //Create Date Formatter
        let dateFormatter = NSDateFormatter()

        //Specify Format of String to Parse
        dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss.SSSSxxx"

        //Parse into NSDate
        let dateFromString : NSDate = dateFormatter.dateFromString(self)!

        //Return Parsed Date
        return dateFromString
    }
}

Kemudian jika Anda ingin mengubah string Anda menjadi NSDate, Anda bisa menulis sesuatu seperti:

var myDate = myDateString.toDateTime()
pengguna2266987
sumber
1
Terima kasih. Mungkin juga, walaupun kurang bermanfaat, untuk menulis: var myDate = "04-05-2015" .toDateTime () Saya menemukan ini berguna saat mengatur data pengujian.
Stephen Watson
1
Saya cukup yakin bahwa hhseharusnya HHdalam hal ini.
Alex
Ini tidak memberi saya dalam format yang saya tentukan: var date = NSDate (); biarkan dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, YYYY"; biarkan myDate = dateFormatter.stringFromDate (date); Dan di atas ini jika saya menggunakan ekstensi Anda seperti ini -> var myDate2 = myDate.toDateTime (); Ini memberi saya tanggal yang sama sekali berbeda dan bukan tanggal saat ini.
Arjun Kalidas
9

Untuk Swift 3

func stringToDate(_ str: String)->Date{
    let formatter = DateFormatter()
    formatter.dateFormat="yyyy-MM-dd hh:mm:ss Z"
    return formatter.date(from: str)!
}
func dateToString(_ str: Date)->String{
    var dateFormatter = DateFormatter()
    dateFormatter.timeStyle=DateFormatter.Style.short
    return dateFormatter.string(from: str)
}
Rishabh Dugar
sumber
5

Fragmen kode pada halaman QA ini "terbalik" ...

Hal pertama yang Apple sebutkan adalah Anda menyimpan cache ...

Tautan ke Apple doco yang menyatakan persis bagaimana melakukan ini:

Cache Formatters for Efficiency Membuat formatter tanggal bukanlah operasi yang murah. ... cache satu contoh ...

Gunakan global ...

let df : DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter 
}()

Maka cukup gunakan formatter itu di mana saja ...

let s = df.string(from: someDate)

atau

let d = df.date(from: someString)

Atau gunakan salah satu dari banyak, banyak metode lain yang nyaman di DateFormatter.

Sesederhana itu.

(Jika Anda menulis ekstensi pada String, kode Anda benar-benar "terbalik" - Anda tidak dapat menggunakan panggilan dateFormatter!)

Perhatikan bahwa biasanya Anda akan memiliki beberapa global tersebut .. seperti "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" .. dll.

Fattie
sumber
Tidak perlu meninggalkan mereka di ruang lingkup global. Anda dapat memperpanjang Formatter hanya menyatakan properti Anda statis. periksa stackoverflow.com/a/43658213/2303865
Leo Dabus
4

Ekstensi dukungan Swift, dengan ekstensi Anda dapat menambahkan fungsi baru untuk yang sudah ada class, structure, enumeration, atau protocoljenis.

Anda dapat menambahkan initfungsi baru ke NSDateobjek dengan memeras objek menggunakan extensionkata kunci.

extension NSDate
{
    convenience
    init(dateString:String) {
        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyyMMdd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "fr_CH_POSIX")
        let d = dateStringFormatter.dateFromString(dateString)!
        self.init(timeInterval:0, sinceDate:d)
    }
} 

Sekarang Anda bisa init objek NSDate menggunakan:

let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")
Hugo Pereira
sumber
Saya suka cara init. Apakah tidak ada cara lain untuk membuat tanggal tanpa menggunakan timeInterval? bagaimana jika nsdate berhenti memiliki penginisialisasi dengan parameter tanggal? bagaimana Anda akan menyelesaikannya? Secara pribadi saya lebih suka cara init tapi saya tidak tahu bagaimana mengatasi masalah ini
Mijail
Saya memiliki masalah: tanggal saya sebagai string adalah seperti ini: "2017-03-10 22:16:00 +0000" dan saya menggunakan format ini: "yyyy-MM-dd jj: mm: ss Z" dan yang ini: "yyyy-MM-dd'T'HH: mm: ss". Tetapi untuk keduanya, ketika saya melakukan ini: biarkan beginDate = df.date(from: beginDateString), saya mendapat nol! Mengapa? ( df = DateFormatter())
Paul Bénéteau
4

Sejak Swift 3, banyak awalan NS telah dijatuhkan.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
/* date format string rules
 * http://userguide.icu-project.org/formatparse/datetime
 */

let date = dateFormatter.date(from: dateString)
toddg
sumber
Saya memiliki masalah: tanggal saya sebagai string adalah seperti ini: "2017-03-10 22:16:00 +0000" dan saya menggunakan format ini: "yyyy-MM-dd jj: mm: ss Z" dan yang ini: "yyyy-MM-dd'T'HH: mm: ss". Tetapi untuk keduanya, ketika saya melakukan ini: biarkan beginDate = df.date(from: beginDateString), saya mendapat nol! Mengapa? ( df = DateFormatter())
Paul Bénéteau
4

Cepat 3,4:

2 konversi yang bermanfaat:

string(from: Date) // to convert from Date to a String
date(from: String) // to convert from String to Date

Penggunaan: 1.

let date = Date() //gives today's date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"
let todaysDateInUKFormat = dateFormatter.string(from: date)

2.

 let someDateInString = "23.06.2017"
 var getDateFromString = dateFormatter.date(from: someDateInString)
Naishta
sumber
3

UNTUK SWIFT 3.1

func convertDateStringToDate(longDate: String) -> String{

    /* INPUT: longDate = "2017-01-27T05:00:00.000Z"
     * OUTPUT: "1/26/17"
     * date_format_you_want_in_string from
     * http://userguide.icu-project.org/formatparse/datetime
     */

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let date = dateFormatter.date(from: longDate)

    if date != nil {

        let formatter = DateFormatter()
        formatter.dateStyle = .short
        let dateShort = formatter.string(from: date!)

        return dateShort

    } else {

        return longDate

    }
}

CATATAN: INI AKAN KEMBALI STRING ASLI JIKA KESALAHAN

Brian
sumber
2

Untuk menambahkan String dalam Format Tanggal dalam Swift, saya melakukan ini

 var dataFormatter:NSDateFormatter = NSDateFormatter()
                dataFormatter.dateFormat = "dd-MMMM 'at' HH:mm a"

cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)
ioopl
sumber
2

Ini bekerja untuk saya ..

    import Foundation
    import UIKit

    //dateString = "01/07/2017"
    private func parseDate(_ dateStr: String) -> String {
            let simpleDateFormat = DateFormatter()
            simpleDateFormat.dateFormat = "dd/MM/yyyy" //format our date String
            let dateFormat = DateFormatter()
            dateFormat.dateFormat = "dd 'de' MMMM 'de' yyyy" //format return

            let date = simpleDateFormat.date(from: dateStr)
            return dateFormat.string(from: date!)
    }
marlonpya
sumber
1

Berikut adalah beberapa opsi konversi format string to date yang dapat digunakan di iOS cepat.

  1. Thursday, Dec 27, 2018 format = EEEE, MMM d, yyyy
  2. 12/27/2018 format = MM/dd/yyyy
  3. 12-27-2018 09:59 format = MM-dd-yyyy HH:mm
  4. Dec 27, 9:59 AM format = MMM d, h:mm a
  5. December 2018 format = MMMM yyyy
  6. Dec 27, 2018 format = MMM d, yyyy
  7. Thu, 27 Dec 2018 09:59:19 +0000 format = E, d MMM yyyy HH:mm:ss Z
  8. 2018-12-27T09:59:19+0000 format = yyyy-MM-dd'T'HH:mm:ssZ
  9. 27.12.18 format = dd.MM.yy
  10. 09:59:19.815 format = HH:mm:ss.SSS
Devesh
sumber
0
Swift: iOS
if we have string, convert it to NSDate,

var dataString = profileValue["dob"] as String
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"

// convert string into date
let dateValue:NSDate? = dateFormatter.dateFromString(dataString)

if you have and date picker parse date like this

// to avoid any nil value
if let isDate = dateValue {
self.datePicker.date = isDate
}
Vinod Joshi
sumber
0

Anda dapat mencoba kode cepat ini

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"//same as strDate date formator
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00")//Must used if you get one day less in conversion
    let convertedDateObject = dateFormatter.date(from: strDate)
Rahul Panzade
sumber
0

SWIFT 5 , Xcode 11.0

Masukkan (date in string) Anda dalam "dateString" dan dalam format pass "dateFormat" yang Anda inginkan. Untuk memilih format, gunakan situs web NDateFormatter .

func getDateFrom(dateString: String, dateFormat: String) -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat
    dateFormatter.locale = Locale(identifier: "en_US")
    guard let date = dateFormatter.date(from: dateString) else {return nil}
    return date
}
Abdul Karim Khan
sumber
-3
import Foundation

let now : String = "2014-07-16 03:03:34 PDT"
var date : NSDate
var dateFormatter : NSDateFormatter

date = dateFormatter.dateFromString(now)

date // $R6: __NSDate = 2014-07-16 03:03:34 PDT

https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/doc/uid/20000447-SW32

Ch0c0late
sumber
2
Bagaimana cara kerjanya? Pemformat tanggal tidak diinisialisasi dan juga tidak ada alasan untuk membagi deklarasi dan inisialisasi tanggal.
Ixx