Swift 4 неправильная дата и время - PullRequest
1 голос
/ 22 апреля 2020

Я борюсь с часовым поясом, потому что я пытался установить время с полуночи до 23:00:00, однако результат шоу начинается с 6 утра до 5 утра следующего дня. Я пытался установить текущий часовой пояс, все тот же результат. Вот мой код

let day1num = Int(todaynumber.string(from: Date()))! + 1
let day1start = Calendar.current.date(bySetting: .day, value: day1num, of: Date())
let day1end = Calendar.current.date(bySetting: .hour, value: 23, of: day1start!)
print("\(day1start!) to \(day1end!)")

Я получил результат 2020-04-22 06:00:00 +0000 до 2020-04-23 05:00:00 + 0000

Я не хочу с 6 утра до 5 утра следующего дня, мне нужен результат: 2020-04-22 00:00:00 +0000 до 2020-04-22 23:00:00 + 0000

Как я могу решить это? Спасибо!

1 Ответ

1 голос
/ 22 апреля 2020

Ваша проблема в том, что вы неправильно понимаете 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)")
...