То, что большинство людей не знает (по крайней мере, я предполагаю это, потому что я не знал это до тех пор, пока go, когда мне пришлось столкнуться с этой самой проблемой), это то, что календарь может иметь часовой пояс , Поэтому, если у вас есть дата и время и вы настроили календарь .gregorian
с определенным часовым поясом, например, UT C, теперь вы можете просто позвонить startOfDay(for:)
, и вы получите правильный ответ.
Например:
let tz = TimeZone.current
var greg = Calendar(identifier: .gregorian)
greg.timeZone = tz // or whatever
let d = Date() // or whatever
let start = greg.startOfDay(for: d)
print(start) // 2020-03-15 07:00:00 +0000
И это правильно: когда было 15:00 15 марта 2020 года по Гринвичу C в 7 часов утра, это было начало дня (полуночи), когда я находился в момент запуска этого код.