It seems that defining a timezone helps to handle the daylight savning as you can see.
let formatter = DateComponentsFormatter()
var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "America/Toronto") ?? .current
formatter.allowedUnits = [.day, .hour, .minute]
formatter.unitsStyle = .abbreviated
formatter.zeroFormattingBehavior = .dropAll
formatter.maximumUnitCount = 3
formatter.collapsesLargestUnit = false
formatter.calendar = calendar
return formatter
}()
let durationShortAbidjan: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "Africa/Abidjan") ?? .current
formatter.allowedUnits = [.day, .hour, .minute]
formatter.unitsStyle = .abbreviated
formatter.zeroFormattingBehavior = .dropAll
formatter.maximumUnitCount = 3
formatter.collapsesLargestUnit = false
formatter.calendar = calendar
return formatter
}()
let durationShortTokyo: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "Asia/Tokyo") ?? .current
formatter.allowedUnits = [.day, .hour, .minute]
formatter.unitsStyle = .abbreviated
formatter.zeroFormattingBehavior = .dropAll
formatter.maximumUnitCount = 3
formatter.collapsesLargestUnit = false
formatter.calendar = calendar
return formatter
}()
let durationToronto = durationShortToronto.string(from: 86400 * 213) // 213d 1h
let durationAbidjan = durationShortAbidjan.string(from: 86400 * 213) // 213d
let durationTokyo = durationShortTokyo.string(from: 86400 * 213) // 213d