ฉันจะแปลงวันที่สตริงเป็น NSDate ได้อย่างไร


195

ฉันต้องการแปลง "2014-07-15 06: 55: 14.198000 + 00: 00" วันที่สตริงนี้เป็น NSDate ใน Swift


ดูเหมือนว่าสตริงของคุณ "2014-07-15 06: 55: 14.198000 + 00: 00" ไม่สามารถเข้าถึงได้หากคุณใช้ NSDateFormatter
Alex Peda

userguide.icu-project.org/formatparse/datetimeช่วยฉันได้มาก
Shardul

ในฐานะที่เป็นแหล่งข้อมูลร่วมกับคำตอบทั้งหมดด้านล่างนี้ฉันขอแนะนำอย่างยิ่งให้ลองใช้ nsdateformatter.com
user3344977

คำตอบเก่าที่นี่จริงๆผิด เอกสารของ Apple บอกว่าชัดแจ้งคุณต้องแคชฟอร์แมตเตอร์ stackoverflow.com/a/42370648/294884
Fattie

หากคุณต้องการผู้ช่วยที่มีรูปแบบใดnsdateformatter.com
Pedro Luz

คำตอบ:


341

ลองนี้:

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

สอบถามเพิ่มเติมได้ตรวจสอบNSDateFormatterและDateFormatterชั้นเรียนของมูลนิธิกรอบสำหรับวัตถุประสงค์ซีและสวิฟท์ตามลำดับ

Swift 3 และใหม่กว่า (รวม Swift 4)

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
พบวิธีแก้ปัญหาเพียงแค่ต้องตั้งค่า "yyyy-MM-dd hh: mm: ss.SSSSxxx" รูปแบบวันที่นี้
Shardul

1
ฉันมีสตริงวันเช่นนี้ "2014/07/15 06: 55: 14-0400" yyyy-MM-dd hh:mm:ssZZZและฉันพยายามใช้ แต่ฉันไม่สามารถดึงวัตถุวันที่ออกจากสตริงได้
iamprem

2
@Prem ถ้าคุณเห็นผลลัพธ์"2014-07-15 10:55:14 +0000"ที่จะถูกต้อง จากNSDateคำอธิบายผลลัพธ์ของวันที่จะถูกคำนวณด้วยส่วนต่าง (ที่นี่เวลา GMT -4 ชั่วโมง) หากคุณต้องการได้รับความแตกต่างระหว่าง GMT และ UTC ซึ่ง-0400ตรวจสอบข้อมูลอ้างอิง
x4h1d

@ x4h1d เฮ้ฉันเข้าใจแล้ว! ฉันทำผิดพลาดในการที่ควรจะเป็นhh HHขอบคุณ!
iamprem

3
@ lmiguelvargasf yyyy-MM-dd'T'HH:mm:ss.SSS'Z'ผมคิดว่าจะเป็น ฉันสันนิษฐานว่าZเป็นเพียงตัวละครที่นี่ โปรดจำไว้ว่าZมีความหมายพิเศษเช่นกัน หากคุณต้องการZที่จะระบุเป็นกว่ารูปแบบจะเป็นbasic hms yyyy-MM-dd'T'HH:mm:ss.SSSZ
x4h1d

71

สวิฟท์ 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)

สวิฟท์ 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)

ฉันสามารถทำได้ด้วยรหัสนี้


5
รหัสไม่ถูกต้อง มันแสดงผลบางส่วน "15 มกราคม 2014, 12:00 AM"
Jake Lin

5
การใช้ddแทนที่จะDDช่วยแก้ปัญหา "เสมอมกราคม"
Pascal Belloncle

1
เวอร์ชันที่ถูกต้องคือyyyy-MM-ddมิฉะนั้นวันที่แจงจะติดอยู่ในเดือนมกราคม - ฉันอัปเดตคำตอบเพื่อให้สอดคล้องกับการเปลี่ยนแปลง
Zorayr

ถ้าฉันต้องการผ่านวันที่ปัจจุบันเป็นสตริง จะใช้งานได้ไหม
Arjun Kalidas

@Zorayr, Kittisak: ฉันกำลังจะได้รับตัวเลือก (2014-07-14 18:30:00 +0000) นั่นหมายความว่าวันหนึ่งจะลดลง ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
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

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

รายละเอียด

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

สารละลาย

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

การใช้

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

ผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

ข้อมูลมากกว่านี้

เกี่ยวกับรูปแบบวันที่


15

หากคุณจะต้องแยกสตริงเป็นวันที่บ่อยคุณอาจต้องการย้ายฟังก์ชันการทำงานเป็นส่วนขยาย ฉันสร้างไฟล์ sharedCode.swift และใส่ส่วนขยายของฉันไว้ที่นั่น:

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

จากนั้นถ้าคุณต้องการแปลงสตริงของคุณเป็น NSDate คุณสามารถเขียนดังนี้

var myDate = myDateString.toDateTime()

1
ขอบคุณ เป็นไปได้แม้ว่าจะมีประโยชน์น้อยกว่าในการเขียน: var myDate = "04-05-2015" .toDateTime () ฉันพบว่ามีประโยชน์เมื่อตั้งค่าข้อมูลทดสอบ
Stephen Watson

1
ฉันค่อนข้างแน่ใจว่าhhควรจะเป็นHHในกรณีนี้
อเล็กซ์

สิ่งนี้ไม่ได้ให้ฉันในรูปแบบที่ฉันระบุ: var date = NSDate (); ให้ dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, YYYY"; ให้ myDate = dateFormatter.stringFromDate (date); และด้านบนของสิ่งนี้ถ้าฉันใช้ส่วนขยายของคุณเช่นนี้ -> var myDate2 = myDate.toDateTime (); มันให้ฉันวันที่แตกต่างกันทั้งหมดและไม่ใช่วันที่ปัจจุบัน
Arjun Kalidas

9

สำหรับ 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)
}

5

ส่วนย่อยของรหัสในหน้า QA นี้คือ "คว่ำ" ...

สิ่งแรกที่ Apple กล่าวถึงคือคุณเก็บ formatter ของคุณ ...

เชื่อมโยงไปยัง Apple doco โดยระบุว่าจะทำอย่างไร:

ตัวจัดรูปแบบแคชเพื่อประสิทธิภาพ การสร้างตัวจัดรูปแบบวันที่ไม่ใช่การดำเนินการที่ถูก ... แคชอินสแตนซ์เดียว ...

ใช้ทั่วโลก ...

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

จากนั้นใช้ฟอร์แมตเตอร์ที่ใดก็ได้ ...

let s = df.string(from: someDate)

หรือ

let d = df.date(from: someString)

หรือใช้วิธีการอื่นที่มากมายและสะดวกสบายมากมายใน DateFormatter

มันง่ายมาก

(หากคุณเขียนส่วนขยายบน String รหัสของคุณจะ "กลับหัว" อย่างสมบูรณ์ - คุณไม่สามารถใช้การเรียกแบบวันที่แบบฟอร์มใด ๆ ได้!)

โปรดทราบว่าโดยปกติแล้วคุณจะมี globals สองสามตัวเช่น .. "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" .. เป็นต้น


ไม่จำเป็นต้องทิ้งไว้ในขอบเขตทั่วโลก คุณสามารถขยายตัวจัดรูปแบบเพียงแค่ประกาศคุณสมบัติของคุณคงที่ ตรวจสอบstackoverflow.com/a/43658213/2303865
Leo Dabus

4

ส่วนขยายการสนับสนุนสวิฟท์ที่มีนามสกุลคุณสามารถเพิ่มฟังก์ชันการทำงานใหม่ที่มีอยู่class, structure, enumerationหรือprotocolประเภท

คุณสามารถเพิ่มinitฟังก์ชั่นใหม่ไปยังNSDateวัตถุโดยการขยายวัตถุโดยใช้extensionคำหลัก

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

ตอนนี้คุณสามารถเริ่มต้นวัตถุ NSDate โดยใช้:

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

ฉันชอบวิธีการเริ่มต้น ไม่มีวิธีอื่นในการสร้างวันที่โดยไม่ใช้ timeInterval หรือไม่ จะเกิดอะไรขึ้นถ้า nsdate หยุดมี initializer พร้อมพารามิเตอร์ date? คุณจะแก้ปัญหาอย่างไร โดยส่วนตัวแล้วฉันชอบวิธีการเริ่มต้น แต่ฉันไม่รู้ว่าจะเอาชนะปัญหานี้ได้อย่างไร
Mijail

ฉันมีปัญหา: วันที่ของฉันเป็นสตริงเป็นเช่นนี้: "2017-03-10 22:16:00 +0000" และฉันใช้รูปแบบนี้: "yyyy-MM-dd hh: mm: ss Z" และอันนี้: "YYYY-MM-dd'T'HH: mm: ss" แต่สำหรับทั้งคู่เมื่อฉันทำสิ่งนี้ให้เริ่มต้นวันที่ = df.date(from: beginDateString)ฉันได้รับศูนย์! ทำไม? ( df = DateFormatter())
Paul Bénéteau

4

ตั้งแต่ Swift 3 คำนำหน้า NS จำนวนมากได้ถูกดร็อป

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)

ฉันมีปัญหา: วันที่ของฉันเป็นสตริงเป็นเช่นนี้: "2017-03-10 22:16:00 +0000" และฉันใช้รูปแบบนี้: "yyyy-MM-dd hh: mm: ss Z" และอันนี้: "YYYY-MM-dd'T'HH: mm: ss" แต่สำหรับทั้งคู่เมื่อฉันทำสิ่งนี้ให้เริ่มต้นวันที่ = df.date(from: beginDateString)ฉันได้รับศูนย์! ทำไม? ( df = DateFormatter())
Paul Bénéteau

4

สวิฟท์ 3,4:

2 การแปลงที่มีประโยชน์:

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

การใช้งาน: 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

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

    }
}

หมายเหตุ: สิ่งนี้จะได้รับผลตอบแทนเดิมหากมีข้อผิดพลาด


2

ในการเพิ่มสตริงภายในรูปแบบวันที่ในสวิฟท์ฉันทำสิ่งนี้

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

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

2

งานนี้สำหรับฉัน ..

    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

ด้านล่างนี้เป็นตัวเลือกการแปลงรูปแบบสตริงเป็นรูปแบบวันที่ใน iOS ได้อย่างรวดเร็ว

  1. Thursday, Dec 27, 2018 = รูปแบบ EEEE, MMM d, yyyy
  2. 12/27/2018 = รูปแบบ MM/dd/yyyy
  3. 12-27-2018 09:59 = รูปแบบ MM-dd-yyyy HH:mm
  4. Dec 27, 9:59 AM = รูปแบบ MMM d, h:mm a
  5. December 2018 = รูปแบบ MMMM yyyy
  6. Dec 27, 2018 = รูปแบบ MMM d, yyyy
  7. Thu, 27 Dec 2018 09:59:19 +0000 = รูปแบบ E, d MMM yyyy HH:mm:ss Z
  8. 2018-12-27T09:59:19+0000 = รูปแบบ yyyy-MM-dd'T'HH:mm:ssZ
  9. 27.12.18 = รูปแบบ dd.MM.yy
  10. 09:59:19.815 = รูปแบบ 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

คุณสามารถลองใช้รหัสนี้ได้อย่างรวดเร็ว

    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

ผ่าน (date in string) ของคุณใน "dateString" และในรูปแบบ "passFormat" pass ที่คุณต้องการ เพื่อเลือกรูปแบบใช้เว็บไซต์ 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
}

-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
มันควรจะทำงานอย่างไร ตัวจัดรูปแบบวันที่ไม่ได้เริ่มต้นและยังไม่มีเหตุผลที่จะแยกการประกาศและการเริ่มต้นของวันที่
Ixx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.