Быстрое манипулирование датами - странное возвращение месяца - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь сделать некоторые манипуляции с датами со Swift, и я получаю неожиданный результат.Веб-сервис передаст строковую дату, а затем я хочу получить этот месяц и предыдущий месяц.Я использую этот код (с удаленным вводом и тому подобным):

import Foundation

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(identifier: "America/New_York")
formatter.dateFormat = "yyyy-MM-dd"

let date = formatter.date(from: "2018-12-01")!
let prev = Calendar.current.date(byAdding: .month, value: -1, to: date)!

formatter.string(from: date)
formatter.string(from: prev)

Итак, у меня есть действительная дата, а затем я вычитаю из нее месяц.Первая отформатированная дата показывает мое ожидаемое значение 2018-12-01, но затем во второй строке вместо 2018-11-01 указано 2018-10-31.

Я нахожусь в PST, который, конечно, на 3 часа опережает EST.Если я добавлю 3 часа, я получу ожидаемые строки.Однако, поскольку строки ввода и вывода были выполнены с помощью средства форматирования с использованием часового пояса, почему я не получаю ожидаемый результат?

1 Ответ

0 голосов
/ 01 января 2019

Проблема в том, что Calendar.current находится в другом часовом поясе (для вас), чем форматер.

Так что date - 1 декабря 2018 года в полночь по нью-йоркскому времени.Но это для вас 30 ноября 2018 года в 21:00 по местному времени (PST).

Когда вы вычитаете один месяц, это делается по местному времени (Calendar.current), поэтому вы получаете 30 октября 2018 года в 21:00.Затем вы форматируете эту дату по нью-йоркскому времени, и она будет получена 31 октября 2018 года в полночь.

Чтобы получить правильные результаты, вам нужен календарь в том же часовом поясе, что и форматтер:

var cal = Calendar(identifier: Calendar.current.identifier)
cal.timeZone = formatter.timeZone
let prev = cal.date(byAdding: .month, value: -1, to: date)!

Это даст ожидаемый результат.

...