2017-01-08 22 views
0

У меня есть следующая функция Swift (Swift 3), чтобы сделать дату (Date) с компонентами даты (DateComponents).Дата создания с данными числами

func makeDate(year: Int, month: Int, day: Int, hr: Int, min: Int, sec: Int) -> NSDate { 
    let calendar = NSCalendar(calendarIdentifier: .gregorian)! 
    let components = NSDateComponents() 
    components.year = year 
    components.month = month 
    components.day = day 
    components.hour = hr 
    components.minute = min 
    components.second = sec 
    let date = calendar.date(from: components as DateComponents) 
    return date! as NSDate 
} 

Если я использую его, он вернет дату GMT.

override func viewDidLoad() { 
    super.viewDidLoad() 
    let d = makeDate(year: 2017, month: 1, day: 8, hr: 22, min: 16, sec: 50) 
    print(d) // 2017-01-08 13:16:50 +0000 
} 

То, что я действительно хочу вернуть, - это дата (2017-01-08 22:16:50), буквально основанная на этих числах. Как я могу это сделать с DateComponents? Благодарю.

+0

Проблема в том, что она автоматически учитывает временную зону? –

+0

Если да, возможно, вам стоит попробовать использовать NSDateFormatter? –

ответ

1

Функция возвращает правильную дату. Это функция print, которая отображает дату в формате UTC.

Кстати, Swift 3 версии вашей функции родной является

func makeDate(year: Int, month: Int, day: Int, hr: Int, min: Int, sec: Int) -> Date { 
    var calendar = Calendar(identifier: .gregorian) 
    // calendar.timeZone = TimeZone(secondsFromGMT: 0)! 
    let components = DateComponents(year: year, month: month, day: day, hour: hr, minute: min, second: sec) 
    return calendar.date(from: components)! 
} 

Но если вы действительно хотите иметь дату UTC, раскомментируйте строку, чтобы установить часовой пояс.

0

NSDate ничего не знает о часовых поясах. Он представляет собой момент времени, не зависящий от каких-либо календарей или часовых поясов. Только когда вы распечатываете его, как вы здесь, он преобразуется в GMT. Это нормально, но это только для отладки. Для реального вывода используйте NSDateFormatter для преобразования даты в строку.

В качестве хакерского решения вы можете просто настроить свой календарь для использования GMT при создании объекта даты из ваших компонентов. Таким образом вы получите строку, которую вы ожидаете. Конечно, любой другой расчет с этой датой тогда может оказаться неправильным.