2017-04-08 53 views
1

我想解析一個字符串,我從本地返回一個MySQL Date數據類型作爲日期。然而,每次我嘗試在Swift 3中用進行解析時,結果日期都是兩天。Swift 3解析日期字符串

下面是從服務器返回的日期字符串的例子:

「星期六2016年12月31日00:00:00 GMT-0800(PST)」

我嘗試使用捕捉按以下格式字符串信息:

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

然後我用這樣的:

static func stringDateToDateTwo(dateString: String, timeZone: TimeZone = TimeZone.current) -> Date { 
    dateFormatter.dateFormat = DateFormatServerTwo 
    dateFormatter.timeZone = timeZone 
    return dateFormatter.date(from: dateString) ?? Date() 
} 

其中dateFormatter分配給

我認爲問題是,有與時區偏移,我不能正確捕捉信息。通過切斷日期字符串的一部分,即當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

一個問題是格式爲GMT-XXXX的時區沒有格式說明符。有一個用於GMT-XX:XX,但你沒有這種格式。因此,此解決方案將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) 

以這種方式完成後,日期似乎確實正常。讓我知道,如果您在Playground中嘗試此操作,結果會有所不同。