Ваша проблема в том, что вы неправильно понимаете Date
и то, как он печатается на консоли.
Date
s представляют моменты времени. Думайте о них как о целом числе, представляющем количество времени, прошедшее с контрольной даты. Это НЕ читаемая человеком строка. Чтобы преобразовать дату в удобочитаемую строку, вам нужно использовать DateFormatter
и обязательно установить timeZone
форматера даты в качестве часового пояса, в котором вы хотите, чтобы строка представляла (это будет по умолчанию используется текущий часовой пояс системы). Значение timeZone
будет влиять на полученную строку. Например, если у вас есть средство форматирования даты, где часовой пояс имеет значение Pacifi c, он может вернуть значение, подобное April 22, 2020 6:00 PM
, но затем, если вы измените часовой пояс на горное время и получите строку из даты, он вернет April 22, 2020 7:00 PM
.
Когда вы печатаете экземпляр Date
на консоль, система форматирует его в удобочитаемую строку в часовом поясе UTC
. Если я правильно делаю свою математику, вы находитесь в горном времени, поэтому записанное вами значение на 6 часов опережает ожидаемое вами значение.
Если вы хотите увидеть Если пользователь вошел в консоль, как ее увидит пользователь, вы должны использовать экземпляр DateFormatter
. По умолчанию будет использоваться системный часовой пояс пользователя, затем используется значение Date
, которое вы рассчитали, чтобы получить представление String
этой даты, а затем записать String
в консоль, а не саму дату.
let formatter = DateFormatter()
formatter.dateStyle = .medium // Customize as needed
formatter.timeStyle = .medium // Customize as needed
// formatter.timeZone = ... something else if you don't want to use the system time zone
let day1StartAsString = formatter.string(from: day1start!)
let day1EndAsString = formatter.string(from: day1end!)
print("\(day1StartAsString) to \(day1EndAsString)")