Похоже, что вы установили часовой пояс для форматера в UTC, но затем попытаетесь установить день в вашем местном часовом поясе.
Если вы воспользуетесь этим кодом - вы увидите 24-й день
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
let date = dateFormatter.date(from: "2018-07-24")
print(dateFormatter.string(from: date!)) // prints "2018-07-24"
Но если вы используете «Календарь», чтобы получить компонент дня из даты, вы получите день со смещением timeZone.
Так, например, в моем часовом поясе я вижу 24-й день (GMT + 02), используя этот код
var calendar = Calendar.current
let day = calendar.component(.day, from: date!)
print(day) // prints 24
Но если я установлю часовой пояс для календаря где-нибудь в США, я вижу 23-й день
var calendar = Calendar.current
calendar.timeZone = TimeZone.init(abbreviation: "MDT")!
let day = calendar.component(.day, from: date!)
print(day) // prints 23
Таким образом, календарь использует ваш местный часовой пояс для получения компонента с даты
Так что, если вам нужно получить компонент дня из даты, используйте тот же часовой пояс, который вы использовали для анализа даты из строки.
var calendar = Calendar.current
calendar.timeZone = TimeZone(abbreviation: "UTC")!
let day = calendar.component(.day, from: date!)
print(day) // prints 24