我无法将 iso8601 转换为字符串 swift

I can't convert iso8601 to string swift

我有一个来自 API 的字符串,它的格式是这样的

"2021-03-01T15:00:00+07:00"

所以我尝试使用此代码将此字符串转换为日期

   // string to date
   let dateFormatter = DateFormatter()
   dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
   let date = dateFormatter.date(from: isoDate)!
   
   print("date from date Formatter = \(date)")
   
   // convert date back to string
   dateFormatter.dateFormat = "EEEE HH:mm"
   let dateString = dateFormatter.string(from: date)
   
   print("date string \(dateString)")
   return dateString    

我期望的结果是 -> "2021-03-01 08:00:00 +0000", "Monday 15:00"

当我在操场上尝试这个时,结果是我想要的,但是当我在我的项目中尝试这个时,结果是

-> "1478-03-01 08:00:00 +0000", "Sunday 14:42"

如何将结果更改为与我期望的相同?谢谢

看起来您使用的日历与您在项目中预期的不同(buddhist 可能?)我想这是因为您没有明确设置日历,所以它是在系统偏好设置中设置的.

因此,如果您出于某种原因不想使用用户当前的日历(以及区域设置和时区),您需要在日期格式化程序实例上设置这些属性

//Gregorian calendar
dateFormatter.calendar = Calendar.init(identifier: .gregorian)
//UTC time zone
dateFormatter.timeZone = TimeZone(identifier: "UTC")
//English locale
dateFormatter.locale = Locale(identifier: "en_US_POSIX")

这将为您提供预期的输出。

请注意,playground 在使用方面有点不合时宜,它似乎是我们在系统首选项中设置的内容和硬编码值的混合体。