2017-10-10 81 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仍然是错误的 –