Dize tarihini NSDate'e nasıl dönüştürebilirim?


195

Bu dize tarihini "2014-07-15 06: 55: 14.198000 + 00: 00" Swift'te NSDate'e dönüştürmek istiyorum.


Görünüşe göre "2014-07-15 06: 55: 14.198000 + 00: 00" dizeniz NSDateFormatter
Alex Peda


Aşağıdaki tüm cevaplara eşlik eden bir kaynak olarak, nsdateformatter.com
user3344977

Buradaki eski cevaplar gerçekten YANLIŞ . Apple doco, biçimlendiriciyi önbelleğe almanız gerektiğini net bir şekilde söylüyor. stackoverflow.com/a/42370648/294884
Fattie

Yanıtlar:


341

bunu dene:

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 */)

Daha fazla sorgu için, Objective-C ve Swift için NSDateFormatter ve DateFormatter Foundation temel sınıflarını kontrol edin .

Swift 3 ve üstü (Swift 4 dahil)

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

11
Çözüm bulundu sadece "yyyy-AA-gg ss: dd: ss.SSSSxxx" bu tarih biçimini ayarlamanız gerekir
Shardul

1
Bunun gibi bir tarih dizesi var "2014-07-15 06: 55: 14-0400" ve kullanmayı denedim yyyy-MM-dd hh:mm:ssZZZ. Ancak tarih nesnesini dizeden çıkaramıyorum.
iamprem

2
@Prem, çıktının doğru "2014-07-15 10:55:14 +0000"olduğunu görürseniz . Tanımdan itibaren NSDate, tarihin çıktısı fark ile hesaplanacaktır (burada GMT -4 saat). Eğer GMT ve UTC arasındaki farkı almak istiyorsanız, -0400bu referansı
x4h1d

@ x4h1d, Hey anladım! hhOlması gereken bir hata yaptım HH. Teşekkürler!
iamprem

3
@ lmiguelvargasf, bence bu olur yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. ZBurada sadece bir karakter olduğunu varsaydım . Unutmayın, Zözel bir anlamı da var. Biçim Zolarak belirtmek isterseniz basic hmsolur yyyy-MM-dd'T'HH:mm:ss.SSSZ.
x4h1d

71

Hızlı 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)

Hızlı 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)

Bu kodla yapabilirim.


5
Kod doğru değil. Bazı "15 Ocak 2014, 12:00" çıktı
Jake Lin

5
ddyerine kullanmak DD"her zaman Ocak" sorununun düzeltilmesine yardımcı olacaktır.
Pascal Belloncle

1
Doğru sürüm yyyy-MM-dd, aksi takdirde, ayrıştırılan tarih Ocak ayında sıkıştı - Değişikliği yansıtmak için cevabı güncelledim.
Zorayr

Geçerli tarihi dize olarak geçirmek istersem ne olur? Bu işe yarayacak mı?
Arjun Kalidas

@Zorayr, Kittisak: Dışarı çıkıyorum, İsteğe bağlı (2014-07-14 18:30:00 +0000) yani bir gün azalıyor. Bunu nasıl düzeltebilirim?
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
}

Swift 3 için güncellendi.

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
}

17

ayrıntılar

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

Çözüm

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)
    }
}

kullanım

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)!)")

Sonuç

resim açıklamasını buraya girin

Daha fazla bilgi

Tarih biçimi hakkında


15

Dizeyi sık sık bir tarihte ayrıştırmanız gerekirse, işlevselliği bir uzantıya taşımak isteyebilirsiniz. Bir sharedCode.swift dosyası oluşturdum ve uzantılarımı buraya koydum:

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
    }
}

Eğer dizenizi bir NSDate'e dönüştürmek istiyorsanız, şöyle bir şey yazabilirsiniz:

var myDate = myDateString.toDateTime()

1
Teşekkürler. Ayrıca, daha az kullanışlı olsa da, yazmak mümkündür: var myDate = "04-05-2015" .toDateTime () Test verilerini ayarlarken bunu kullanışlı buldum.
Stephen Watson

1
Bu durumda hholması gerektiğine eminim HH.
Alex

Bu bana belirttiğim biçimde vermiyor: var date = NSDate (); let dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, YYYY"; let myDate = dateFormatter.stringFromDate (tarih); Ve bunun gibi uzantınızı böyle kullanırsanız -> var myDate2 = myDate.toDateTime (); Bana şimdiki tarihi değil, bambaşka bir tarih veriyor.
Arjun Kalidas

9

Swift 3 için

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)
}

5

Bu KG sayfasındaki kod parçaları "baş aşağı" dur ...

Apple'ın bahsettiği ilk şey, biçimlendiricinizi önbelleğe almanızdır ...

Bunun nasıl yapılacağını belirten Apple doco'ya bağlantı:

Verimlilik için Önbellek Biçimlendiriciler Tarih biçimlendirici oluşturmak ucuz bir işlem değildir. ... tek bir örneği önbelleğe al ...

Global kullanın ...

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

O zaman bu formatlayıcıyı her yerde kullanın ...

let s = df.string(from: someDate)

veya

let d = df.date(from: someString)

Ya da DateFormatter'da diğer birçok çok sayıda uygun yöntemden birini kullanın.

Bu kadar basit.

(String'e bir uzantı yazarsanız, kodunuz tamamen "baş aşağı" dır - dateFormatter çağrılarını kullanamazsınız!)

Genellikle "globalForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" .. vb.


Onları küresel kapsamda bırakmaya gerek yok. Formatter'ı genişleterek özelliklerinizi statik olarak bildirebilirsiniz. Bunu kontrol stackoverflow.com/a/43658213/2303865
Leo Dabus

4

Swift destek uzantıları, uzantısı ile varolan yeni işlevler ekleyebilirsiniz class, structure, enumeration, veya protocoltipi.

Anahtar kelimeyi kullanarak nesneyi genişleterek nesneye yeni bir initişlev ekleyebilirsiniz .NSDateextension

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)
    }
} 

Artık aşağıdakileri kullanarak bir NSDate nesnesini başlatabilirsiniz:

let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")

Başlangıç ​​yolunu seviyorum. TimeInterval kullanmadan tarih oluşturmanın başka bir yolu yok mu? nsdate bir date parametresine sahip bir başlatıcıya sahip olmayı bırakırsa ne olur? nasıl çözerdin? Şahsen bir init yolunu tercih ederim ama bu sorunun üstesinden nasıl geleceğimi bilmiyorum
Mijail

Bir sorunum var: dize olarak tarihim şöyle: "2017-03-10 22:16:00 +0000" ve ben şu biçimi kullandım: "yyyy-AA-gg ss: dd: ss Z" ve bu: "yyyy-aA-gg'T'SS: dd: ss". Ama her ikisi için, bunu yaptığımda: let beginDate = df.date(from: beginDateString), bir nil olsun! neden? ( df = DateFormatter())
Paul Bénéteau

4

Swift 3'ten beri, NS öneklerinin çoğu bırakıldı.

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)

Bir sorunum var: dize olarak tarihim şöyle: "2017-03-10 22:16:00 +0000" ve ben şu biçimi kullandım: "yyyy-AA-gg ss: dd: ss Z" ve bu: "yyyy-aA-gg'T'SS: dd: ss". Ama her ikisi için, bunu yaptığımda: let beginDate = df.date(from: beginDateString), bir nil olsun! neden? ( df = DateFormatter())
Paul Bénéteau

4

Hızlı 3,4:

2 yararlı dönüşüm:

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

Kullanım: 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)

3

SWIFT 3.1 İÇİN

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

    }
}

NOT: BU HATA EĞER ORİJİNAL STRING İADE EDECEK


2

Swift'te Tarih Biçimi içine Dize eklemek için bunu yaptım

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

cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)

2

Bu iş benim için ..

    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!)
    }

1

Aşağıda hızlı iOS'da kullanılabilen bazı dize-tarih formatı dönüştürme seçenekleri bulunmaktadır.

  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

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
}

0

Bu hızlı kodu deneyebilirsiniz

    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)

0

SWIFT 5 , Xcode 11.0

(Dizedeki tarih) öğenizi "dateString" ve "dateFormat" geçiş biçiminde geçirin. Biçimi seçmek için NDateFormatter web sitesini kullanın .

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
}

-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


2
Bunun nasıl çalışması gerekiyor? Tarih biçimlendirici başlatılmadı ve tarihin bildirimini ve başlatılmasını bölmek için de bir neden yok.
Ixx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.