2017-04-08 158 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中尝试此操作,结果会有所不同。