문자열 날짜를 NSDate로 변환하려면 어떻게해야합니까?


195

이 문자열 날짜 "2014-07-15 06 : 55 : 14.198000 + 00 : 00"을 Swift의 NSDate로 변환하고 싶습니다.


NSDateFormatter를 사용하면 문자열 "2014-07-15 06 : 55 : 14.198000 + 00 : 00"에 도달 할 수없는 것 같습니다
Alex Peda

userguide.icu-project.org/formatparse/datetime 이 많은 도움이되었습니다
Shardul

아래의 모든 답변에 대한 동반자 리소스로서 nsdateformatter.com
user3344977에서 21시 34 분

여기에있는 오래된 답변은 실제로 잘못되었습니다 . 애플 도코는 포맷터를 캐시해야한다고 수정했다. stackoverflow.com/a/42370648/294884
Fattie

당신은 형식, 어떤 도우미가 필요한 경우 nsdateformatter.com
페드로 루즈

답변:


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

추가 쿼리 는 Objective-C 및 Swift에 대한 Foundation 프레임 워크 의 NSDateFormatterDateFormatter 클래스를 각각 확인하십시오.

스위프트 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 hmsyyyy-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
코드가 올바르지 않습니다. 그것은 "2014 년 1 월 15 일 오전 12시"를 출력합니다
Jake Lin

5
사용하는 dd대신 것은 DD은 "항상 1월"문제를 해결하는 데 도움이됩니다.
Pascal Belloncle

1
올바른 버전은, yyyy-MM-dd그렇지 않으면 구문 분석 된 날짜가 1 월에 멈춤-변경 사항을 반영하여 답변을 업데이트했습니다.
Zorayr

현재 날짜를 문자열로 전달하려면 어떻게해야합니까? 이것이 효과가 있습니까?
Arjun Kalidas

@Zorayr, Kittisak : 나는 아웃풋을 받고 있는데, Optional (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
}

스위프트 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

세부

  • 스위프트 4, Xcode 9.2
  • 스위프트 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.
Alex

이것은 내가 지정한 형식으로 제공하지 않습니다. var date = NSDate (); let dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, YYYY"; let myDate = dateFormatter.stringFromDate (날짜); 그리고 이것과 같이 확장을 사용하면-> var myDate2 = myDate.toDateTime (); 현재 날짜가 아닌 완전히 다른 날짜를 제공합니다.
Arjun Kalidas

9

스위프트 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

이 품질 보증 페이지의 코드 조각은 "거꾸로되어 있습니다"...

애플이 가장 먼저 언급 한 것은 포맷터를 캐시한다는 것입니다.

이 작업을 수행하는 방법을 정확히 알려주는 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에서 확장을 작성하면 코드가 완전히 거꾸로되어 있습니다. dateFormatter 호출을 사용할 수 없습니다!)

일반적으로 "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen"등과 같은 몇 가지 전역이 있습니다.


글로벌 범위에 두지 않아도됩니다. Formatter를 확장하면 속성을 정적으로 선언 할 수 있습니다. 이 stackoverflow.com/a/43658213/2303865
Leo Dabus를

4

신속한 지원 확장, 확장과 기존에 새로운 기능을 추가 할 수 있습니다 class, structure, enumeration, 또는 protocol유형입니다.

키워드를 사용하여 객체를 확장하여 객체에 새 init함수를 추가 할 수 있습니다 .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)
    }
} 

이제 다음을 사용하여 NSDate 객체를 초기화 할 수 있습니다.

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

나는 init 방식을 좋아한다. timeInterval을 사용하지 않고 날짜를 만드는 다른 방법이 없습니까? nsdate가 date 매개 변수로 초기화 프로그램을 갖는 것을 중지하면 어떻게됩니까? 어떻게 해결하겠습니까? 개인적으로 나는 init 방식을 선호하지만이 문제를 극복하는 방법을 모른다
Mijail

문제가 있습니다 : 문자열로 내 날짜는 "2017-03-10 22:16:00 +0000"이고이 형식은 "yyyy-MM-dd hh : mm : ss Z"와이 형식을 사용했습니다. "yyyy-MM-dd'T'HH : mm : ss". 그러나이 작업을 수행 할 때 beginDate =하자 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". 그러나이 작업을 수행 할 때 beginDate =하자 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

스위프트 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

Swift의 날짜 형식 내에 문자열을 추가하려면이 작업을 수행하십시오.

 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

스위프트 5 , Xcode 11.0

"날짜 문자열"과 "날짜 형식"패스 형식으로 (날짜 문자열)을 전달하십시오. 형식을 선택하려면 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.