2017-10-10 109 views
0
extension Formatter { 
    static let iso8601: DateFormatter = { 
     let formatter = DateFormatter() 
     formatter.calendar = Calendar(identifier: .iso8601) 
     formatter.timeZone = TimeZone.init(identifier: "America/New_York") 
     formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
     return formatter 
    }() 
} 
extension Date { 
    var iso8601: String { 
     return Formatter.iso8601.string(from: self) 
    } 
} 

extension String { 
    var dateFromISO8601: Date? { 
     return Formatter.iso8601.date(from: self) // "Mar 22, 2017, 10:22 AM" 
    } 
} 



let dateFormat:String = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
let strDate: String = "2017-10-09T00:00:00.966Z" 
if let dateFromString = strDate.dateFromISO8601 
{ 
    print(dateFromString.iso8601) 
} 

好了,所以它不會做與dateFormatter.date(來源:sweDate)什麼)呢!? 如何獲取日期字符串值?斯威夫特日期時區問題

根據我所知,日期不存儲時區,因此它總是打印UTC時間,不管我在格式化時使用了哪個時區。

那麼什麼是解決方案,因爲我必須將我的本地日期與轉換日期進行比較。我無法與字符串進行比較。 任何幫助表示讚賞。

+0

「YYYY-MM-dd'T'HH:MM:ss.SSS'Z'原」是錯的。通過轉義Z,它不會考慮日期字符串中的時區。 Z表示UTC。如果你轉義Z,它會將你的日期字符串解釋爲本地時間,這是錯誤的 –

+0

你可以設置一個不同的時區,但是當用包含時區的日期格式解析你的日期時也不會有什麼區別。「」yyyy- MM-dd'T'HH:mm:ss.SSSZ「'檢查此https://stackoverflow.com/a/28016692/2303865。您可以使用TimeZone將日期轉換爲具有特定語言環境的字符串。 –

+0

@LeoDabus我認爲這是沒有問題的Z即使我逃脫Z它仍然輸出錯誤的日期 –

回答

2

您應該使用日曆法dateComponents(in: TimeZone)檢查相對日期組件在不同的時區爲:

let dateString = "2017-10-09T18:00:00.000Z" 
let formatter = DateFormatter() 
formatter.calendar = Calendar(identifier: .iso8601) 
formatter.locale = Locale(identifier: "en_US_POSIX") 
formatter.timeZone = TimeZone(secondsFromGMT: 0) 
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX" 
let date = formatter.date(from: dateString)! // "Oct 9, 2017 at 3:00 PM" in Brazil 
               // "Oct 9, 2017 at 2:00 PM" in New York 
let components = Calendar.current.dateComponents(in: TimeZone(identifier: "America/New_York")!, from: date) //calendar: gregorian (fixed) timeZone: America/New_York (fixed) era: 1 year: 2017 month: 10 day: 9 hour: 14 minute: 0 second: 0 nanosecond: 0 weekday: 2 weekdayOrdinal: 2 quarter: 0 weekOfMonth: 2 weekOfYear: 41 yearForWeekOfYear: 2017 isLeapMonth: false 

if 8..<16 ~= components.hour! { 
    print("store is open in NY"). // "store is open in NY\n" 
} 
+0

它工作完美,因爲我想,它真的有幫助我感謝@Leo Dabus –

+0

它的完美,但是當我打印components.date仍然是錯誤的 –