2017-02-22 5 views
2

Я только что перенес код моего приложения в Swift 3, и я получаю эту очень неприятную проблему с DateFormatter (ранее NSDateFormatter), который я не получил с Swift 2 или ранее.Невозможно изменить часовой пояс для DateFormatter в Swift 3

Вопрос заключается в том, что мне нужно, чтобы преобразовать строку в объект Date и мой код, чтобы сделать это что-то вроде,

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1 = dateFormatter.date(from: dateStr1) 

Теперь это работает отлично и, как ожидается, в Xcode игровые площадки, но когда я пытаюсь запустите его из моего приложения, date1 возвращает 2017-02-21 13:00:00 +0000 т.е. день в прошлом, и мне нужна дата1, чтобы быть 2017-02-22 fyi, я в Австралии, где я делая это развитие.

Я получаю строку даты из пользовательского интерфейса моего приложения, а из пользовательского интерфейса - 2017-02-22, поэтому мне нужно скрыть эту строку до объекта Date (или NSDate) в Swift.

я не попытался установить TimeZone и Locale для DateFormatter,

dateFormatter.timeZone = TimeZone(identifier: TimeZone.current.identifier) 

dateFormatter.locale = Locale.init(identifier: Locale.current.identifier) 

, но до сих пор не повезло?

Я также попытался создать даты из компонентов Календарь, как,

var dateComponents = DateComponents() 
var day = "22" 
var month = "02" 
var year = "2017" 
dateComponents.day = Int(day)! 
dateComponents.year = Int(year)! 
print(TimeZone.current) 
dateComponents.timeZone = TimeZone.current 
dateComponents.month = Int(month)! 
let userCalendar = Calendar.current 
let date1 = userCalendar.date(from: dateComponents) 

Но до сих пор не получить правильную дату т.е. получение 2017-02-21 вместо 2017-02-22 Я посмотрел на некоторые другие вопросы, как SO

How do you create a swift Date object

Converting date between timezones swift

среди О.Т. ее. Любые идеи о том, как я могу достичь результата, которого я хочу? этот код работал полностью отлично до Swift.

+0

Почему, по вашему мнению, что-то не так с первым 4-строчным кодом в вашем вопросе? Это нормально и правильно. – rmaddy

+1

Полночь 22 февраля в Австралии - 13:00 в 21-й UTC. Нет ничего плохого. – rmaddy

+0

Достаточно честно! Я отредактировал вопрос, чтобы сделать проблему более ясной. – cptdanko

ответ

1

Как указано в комментариях, Xcode показывает вам дату в своей «необработанной форме» Универсального часового пояса - UTZ (также называемый «Гринвич Meendime»).

Чтобы получить дату, представленную в другом часовом поясе, вам нужно снова использовать DateFormatter.

Итак:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1: Date = dateFormatter.date(from: dateStr1)! 

print("\(date1)") 
print("\(dateFormatter.string(from: date1))") 

дает вам:

Print screen of code in playground with output.

Я бегу этот код в Перт, Западная Австралия (т.е. UTZ + 8) - поэтому, когда я Преобразовать 22-Feb -2017 в дату, которую он хранит как 21-фев-2017 UTZ, но если я верну его обратно с DateFormatter из моей локали, я получу полночь, 22 февраля 2017 года.

Смежные вопросы