23080

[code]

    var str = "2016-02-22T15:00:00.0000000"
    let dateFormatter = NSDateFormatter()
    dateFormatter.locale = NSLocale(localeIdentifier: "ja")
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    print(dateFormatter.dateFromString(str))
    
[/code]

上記コードだと、結果がnilになります。  
データフォーマッターが間違っているのでしょうか？  
strをNSDateに変換する方法を教えて下さい。

よろしくお願いします。


CC BY-SA 3.0
2016-03-13T03:43:17.227
23075
2016-03-13T10:04:13.880
question
ios swift
StringからNSDateに変換


_データフォーマッターが間違っているのでしょうか？_  
はい。NSDateFormatterに与える日付の書式(dateFormat)が間違っています。  
日付の書式文字についてはプラットフォーム(や、その準拠する仕様)によって細かい差異がありますのできちんと調べなおしたほうがいいでしょう。  
[Data Formatting
Guide](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/DataFormatting/DataFormatting.html#//apple_ref/doc/uid/10000029i)

  * OS X v10.9 and iOS 7 use [version tr35-31.](http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns)

あなたの提示している日付文字列の例の場合、

  * 日付と時刻の間に文字`T`が存在します。
  * 時刻の秒以下と思われる数字7桁(*1)が存在します。

また、時差情報を含まない時刻文字列を使用されるなら、timeZoneプロパティも設定しておいたほうが良いでしょう。

以上の点を踏まえてあなたのコードを書き直すとこんな感じになります。

[code]

    var str = "2016-02-22T15:00:00.0000000"
    let dateFormatter = NSDateFormatter()
    dateFormatter.timeZone = NSTimeZone(name: "Asia/Tokyo")
    dateFormatter.locale = NSLocale(localeIdentifier: "ja") //->追記参照
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS"
    let date = dateFormatter.dateFromString(str)
    print(date) //->Optional(2016-02-22 06:00:00 +0000)
    
[/code]

*1 ただし、小数点以下7桁というと100nsec単位ですが、NSDateではそこまで細かい時刻は扱えないようです。また、前3桁がミリ秒で後ろ4桁が時差情報と言う変則的な使い方(UTCからマイナスのオフセットが扱えなくなります)はしていないと思いますが、(私が試した限りでは)そのような文字列をNSDateFormatterでNSDateに変換することはできませんでした。

(追記)  
すっかり忘れていましたが、NSDateFormatterでカスタムの日付書式を使用した場合の結果が、ユーザ設定の影響を受ける場合があるようです。書式固定で日付の処理をする場合には、localeを"en_US_POSIX"にすべきだとされています。  
[Technical Q&A QA1480  
NSDateFormatter and Internet
Dates](https://developer.apple.com/library/ios/qa/qa1480/_index.html)  
手持ちのテスト機では問題になるような状態を作ることはできませんでしたが、
**日付書式を直接指定する場合はlocaleにはen_US_POSIXを必ず指定するもの** と思っていた方が良いでしょう。

[code]

    dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    
[/code]


CC BY-SA 3.0
2016-03-13T05:13:35.450
23080
2016-03-13T10:04:13.880
2016-03-13T10:04:13.880
13972
13972
23075
answer