Если я создаю Date()
, чтобы получить текущую дату и время, я хочу создать новую дату из этого, но с разными часами, минутами и нулевыми секундами, что самый простой способ сделать это с помощью Swift? Я нашел так много примеров с "получением", но не "настройкой".
Как изменить текущие часы дня и минуты в Swift?
Ответ 1
Помните, что в регионах, где используется летнее время, некоторые часы могут не существовать в дни смены часов или они могут встречаться дважды. Оба решения ниже возвращают Date?
и использовать распаковку силой. Вы должны обработать возможный nil
в вашем приложении.
Swift 3, 4 и iOS 8/OS X 10.9 или более поздняя версия
let date = Calendar.current.date(bySettingHour: 9, minute: 30, second: 0, of: Date())!
Swift 2
Используйте NSDateComponents
/DateComponents
:
let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let now = NSDate()
let components = gregorian.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: now)
// Change the time to 9:30:00 in your locale
components.hour = 9
components.minute = 30
components.second = 0
let date = gregorian.dateFromComponents(components)!
Обратите внимание, что если вы вызываете print(date)
, время печати указано в формате UTC. Это тот же момент времени, просто выраженный в другом часовом поясе от вашего. Используйте NSDateFormatter
чтобы преобразовать его в ваше местное время.
Ответ 2
быстрое расширение даты 3 с часовым поясом
extension Date {
public func setTime(hour: Int, min: Int, sec: Int, timeZoneAbbrev: String = "UTC") -> Date? {
let x: Set<Calendar.Component> = [.year, .month, .day, .hour, .minute, .second]
let cal = Calendar.current
var components = cal.dateComponents(x, from: self)
components.timeZone = TimeZone(abbreviation: timeZoneAbbrev)
components.hour = hour
components.minute = min
components.second = sec
return cal.date(from: components)
}
}