سلام. توی یکی از پروژه هایی که کار میکردم، نیاز بود که تاریخی رو که از سرور دریافت میکنم رو به شمسی تبدیل کنم. و هرچه توی سایت های مختلف از جمله StackoverFlow و غیره سرچ کردم برای فارسی به حداقل نتیجه رسیدم به طوری که کارم رو راه ننداخت.
تصمیم گرفتم با آزمون و خطا به نتیجه برسم که در آخر هم رسیدم.

اولین قدم این هست که فیلد تاریخ رو از سرور بگیریم و اون رو تبدیل به String کنیم.
let subStrDate = dateUnix.prefix(16)
let subStr = String(subStrDate)
بعد از اون باید یه متغیر از نوع dateFotmat تعریف کنیم و در اون فرمت تاریخی که میخوایم به عنوان خروجی بگیریم رو مشخص کنیم.
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd HH:mm"
dateFormatter.calendar = Calendar(identifier: .gregorian)
let dateInGrogrian = dateFormatter.date(from: subStr)
و بعد از اون باید یه تقویم تعریف کنیم و تاریخی که بدست اوردیم رو داخل اون قرار بدیم و بعد از اون میتونیم سال، ماه، و روز رو ازش بگیریم.
let calender = NSCalendar(calendarIdentifier: NSCalendar.Identifier.persian)
let components = calender?.components(NSCalendar.Unit(rawValue: UInt.max), from: dateInGrogrian!)
let year = components!.year
let month = components!.month
let day = components!.day
let hour = components?.hour
let minute = components?.minute
و در نهایت میشه ازش استفاده کرد یا اون رو به کاربر نشون داد.
dateFormatter.calendar = Calendar(identifier: .persian)
dateFormatter.dateFormat = "YYYY-MM-dd HH:mm"
let datePersian = "\(String(describing: year!))/\(String(describing: month!))/\(String(describing: day!)) \(String(describing: hour!)):\(String(describing: minute!))"
اگر این مشکل رو شما هم داشتید، امیدوارم بشه با این روش حلش کرد.
موفق باشید.