Использование DateFormatter с TimeZone для форматирования дат в Swift - PullRequest
0 голосов
/ 27 апреля 2018

Как я могу разобрать дату, которая содержит только информацию о дате (без времени), например 2018-07-24

Я пытаюсь с

let dateFormatter = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd"
dateFormatter.dateFormat = dateFormat
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

dateFormatter.date(from: "2018-07-24")

печать день 23

Похоже, он использует 00:00:00 в качестве времени по умолчанию, а затем преобразовывает его в результаты UTC за день до ...

Как я могу это изменить?

1 Ответ

0 голосов
/ 27 апреля 2018

Похоже, что вы установили часовой пояс для форматера в 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
...