2017-04-08 20 views
1

MySQL Dateデータ型から返される文字列をローカルで解析しようとしています。しかし、Swift 3ので解析しようとするたびに、結果の日付は2日間となります。サーバから返さここSwift 3の解析日付文字列

は、日付文字列の例です:

"土曜2016年12月31日00:00:00 GMT-0800(PST)"

私はキャプチャするを使用しよう次の形式の文字列で、その情報:

let DatFormatServerTwo = "EEE MMM dd yyyy HH':'mm':'ss zzzZ '('zzz')'"

は、その後、私はこのようにそれを使用する:

に割り当てられている

私は問題があるタイムゾーンオフセットであり、私が適切にその情報を取得するわけではないということだと思います。私は、TimeZoneのものが画像に入るとすぐに、日付文字列の一部を切り取って、目的の日付を取得します。私はそれが面倒なので、毎回それをしたくないです。

var holidayDateArray = holidayDate.characters.split{$0 == " "}.map(String.init) 
      var count = 0 
      var newString = "" 
      for substring in holidayDateArray { 
       if count < 5 { 
        newString.append(substring) 
       } else { 
        break 
       } 
       count += 1 
      } 

そして、私はこのような形式:

static let DateFormatServerTwo = "EEEMMMddyyyyHH':'mm':'ss" 
+0

あなたはどのタイムゾーンにいますか? – Adrian

答えて

1

1つの問題は、タイムゾーンのフォーマット指定子がGMT-XXXXの形式でないことです。 GMT-XX:XXには1つありますが、その形式はありません。したがって、この解決策はGMTをリテラルとして扱い、Z指定子を使用して-XXXX部分を解析することです。最終的な結果は同じです。

また、句読点を引用する必要はなく、文字通り処理される文字だけを指定することもできます。また、日付文字列からタイムゾーン情報を取得するので、フォーマッタのタイムゾーンを設定する必要はありません。

文字列をまったく処理する必要はありません。ただ、正しい形式を使用します。

let str = "Sat Dec 31 2016 00:00:00 GMT-0800 (PST)" 
let fmt = DateFormatter() 
fmt.dateFormat = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z (z)" 
let dt = fmt.date(from:str) 

これは、指定した文字列についてdtのための正しい結果を与えます。

0

は遊び場で次のことを試してみてください。ここ

は、私は、サーバーから日付を取得するには、文字列をチョップする方法です。

let str = "Sat Dec 31 2016 00:00:00 GMT-0800 (PST)" 
let fmt = DateFormatter() 
fmt.dateFormat = "EEE MMM dd yyyy HH':'mm':'ss zzzZ '('zzz')'" 
let dt = fmt.date(from:str) 

あなたは、日付がnilであることに気づくでしょう。

日付文字列から余分なタイムゾーン情報を削除し、それに応じて日付フォーマッタ文字列をフォーマットする場合:

let str = "Sat Dec 31 2016 00:00:00 -0800" 
let fmt = DateFormatter() 
fmt.dateFormat = "EEE MMM dd yyyy HH':'mm':'ss ZZZZ" 
let dt = fmt.date(from:str) 

あなたが得られます。ちなみにDec 31, 2016, 1:30 PM

を、あなたは引用符は必要ありません。日付形式でコロンの周りに。だから、実際として日付フォーマットを持つことができます。

fmt.dateFormat = "EEE MMM dd yyyy HH:mm:ss ZZZZ" 

日付文字列は、日付がレイアウトされている方法に一貫性がある場合、あなたは簡単のような何かを行うことによって、引用符でGMTとタイムゾーンを削除することができます。

let str = "Sat Dec 31 2016 00:00:00 GMT-0800 (PST)" 
let newStr = str.replacingOccurrences(of:"GMT", with:"").replacingOccurrences(of:"\\(.*?\\)", with:"", options: String.CompareOptions.regularExpression) 
let fmt = DateFormatter() 
fmt.dateFormat = "EEE MMM dd yyyy HH:mm:ss ZZZZ" 
let dt = fmt.date(from:newStr) 

このようにすると、日付が正しく表示されます。プレイグラウンドで試してみると結果が違うかどうか教えてください。

関連する問題