文字列の日付をNSDateに変換するにはどうすればよいですか?


195

この文字列の日付「2014-07-15 06:55:14.198000 + 00:00」をSwiftのNSDateに変換したい。


NSDateFormatterを使用している場合、文字列「2014-07-15 06:55:14.198000 + 00:00」に到達できないようです
Alex


以下のすべての回答の関連リソースとして、nsdateformatter.comを
user3344977

ここでの古い答えは本当に間違っています。Apple docoは、フォーマッタをキャッシュする必要があることを明確に述べています。 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 */)

詳細なクエリについては、Objective-CおよびSwift のFoundationフレームワークの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 2015

2
@Prem、出力が表示"2014-07-15 10:55:14 +0000"される場合はそれが正しいでしょう。NSDate説明からわかるように、日付の出力は差(ここではGMT -4時間)で計算されます。GMTとUTCの違いを知りたい場合は、-0400このリファレンスを
x4h1d

@ x4h1d、ねえ、私はそれを手に入れました!私はhhどちらを間違えたかを間違えましたHH。ありがとう!
iamprem 2015

3
@ lmiguelvargasf、私はそうなると思いますyyyy-MM-dd'T'HH:mm:ss.SSS'Z'Zここでは単なるキャラクターだと思った。覚えZて、特別な意味もあります。形式 Zとして指定したい場合は、次のようになります。basic hmsyyyy-MM-dd'T'HH:mm:ss.SSSZ
x4h1d 2015年

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:00 AM」を出力する
ジェイクリン

5
dd代わりにを使用DDすると、「常に1月」の問題を解決するのに役立ちます。
Pascal Belloncle 2014年

1
正しいバージョンは、yyyy-MM-ddそうでなければ、解析された日付が1月に止まっている-変更を反映するように答えを更新した。
Zorayr

現在の日付を文字列として渡したい場合はどうすればよいですか。これは機能しますか?
Arjun Kalidas、2016年

@Zorayr、Kittisak:私はアウトプットを取得しています、オプション(2014-07-14 18:30:00 +0000)つまり、1日が減分されます。どうすれば修正できますか?
Vineesh TP 2017

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()テストデータを設定するときに、これが便利です。
スティーブンワトソン

1
私はこの場合にあるhhべきだとかなり確信していHHます。
アレックス

これは私が指定するフォーマットでは私に与えません:var date = NSDate(); let dateFormatter = NSDateFormatter(); dateFormatter.dateFormat = "MMMM d、YYYY"; let myDate = dateFormatter.stringFromDate(date); そしてこれに加えて、このような拡張機能を使用する場合-> var myDate2 = myDate.toDateTime(); 現在の日付ではなく、まったく別の日付が表示されます。
Arjun Kalidas 2016年

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が最初に言及することは、フォーマッタをキャッシュすることです...

これを行う方法を正確に説明する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を
レオダバス

4

スウィフトのサポートの拡張機能は、拡張子を持つ既存に新しい機能を追加することができclassstructureenumeration、または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")

私はinitの方法が好きです。timeIntervalを使用せずに日付を作成する別の方法はありませんか?nsdateが日付パラメータを持つイニシャライザを停止した場合はどうなりますか?どのように解決しますか?個人的に私は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)にすると、nilになります。どうして?(df = DateFormatter()
ポールベネトー

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)にすると、nilになります。どうして?(df = DateFormatter()
ポールベネトー

4

Swift 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

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

あなたはこの迅速なコードを試すことができます

    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 5Xcode 11.0

(文字列の日付)を「dateString」と必要な「dateFormat」パス形式で渡します。形式を選択するには、NDateFormatter Webサイトを使用します。

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 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.