Как создать объект даты с даты в быстром xcode.
например, в javascript, который вы бы сделали: var day = new Date('2014-05-20');
Как создать объект даты с даты в быстром xcode.
например, в javascript, который вы бы сделали: var day = new Date('2014-05-20');
Swift имеет собственный тип Date
. Не нужно использовать NSDate
.
В Swift даты и время хранятся в 64-битовом номере с плавающей запятой, измеряющем количество секунд с контрольной даты 1 января 2001 года в 00:00:00 UTC. Это выражается в структуре Date
. Следующее предоставит вам текущую дату и время:
let currentDateTime = Date()
Для создания других дат-времени вы можете использовать один из следующих способов.
Метод 1
Если вам известно количество секунд до или после контрольной даты 2001 года, вы можете использовать это.
let someDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM
Метод 2
Конечно, было бы проще использовать такие вещи, как годы, месяцы, дни и часы (а не относительные секунды), чтобы сделать Date
. Для этого вы можете использовать DateComponents
для указания компонентов, а затем Calendar
для создания даты. Calendar
дает контекст Date
. В противном случае, как он узнает, в каком часовом поясе или календаре его выражать?
// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1980
dateComponents.month = 7
dateComponents.day = 11
dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time
dateComponents.hour = 8
dateComponents.minute = 34
// Create date from components
let userCalendar = Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)
Аббревиатуры других часовых поясов можно найти здесь. Если вы оставите этот пробел, по умолчанию используется часовой пояс пользователя.
Метод 3
Самый лаконичный способ (но не обязательно лучший) - использовать DateFormatter
.
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let someDateTime = formatter.date(from: "2016/10/08 22:31")
Технические стандарты Unicode показывают другие форматы, которые поддерживает DateFormatter
.
Посмотрите мой полный ответ о том, как отображать дату и время в читаемом формате. Также прочитайте эти превосходные статьи:
Лучше всего это сделать с помощью расширения существующего класса NSDate
.
Следующее расширение добавляет новый инициализатор, который будет создавать дату в текущей локали, используя строку даты в указанном вами формате.
extension NSDate
{
convenience
init(dateString:String) {
let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd"
dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let d = dateStringFormatter.dateFromString(dateString)!
self.init(timeInterval:0, sinceDate:d)
}
}
Теперь вы можете создать NSDate из Swift, просто выполнив:
NSDate(dateString:"2014-06-06")
Обратите внимание, что эта реализация не кэширует NSDateFormatter, что может потребоваться из соображений производительности, если вы планируете создавать множество NSDate
таким способом.
Также обратите внимание, что эта реализация просто рухнет, если вы попытаетесь инициализировать NSDate
, передав строку, которая не может быть проанализирована правильно. Это связано с принудительной разверткой необязательного значения, возвращаемого dateFromString
. Если вы хотите вернуть nil
при плохом разборе, в идеале вы должны использовать неисправный инициализатор; но вы не можете сделать это сейчас (июнь 2015 г.) из-за ограничений в Swift 1.2, поэтому следующий ваш лучший выбор - использовать метод фабрики классов.
Более сложный пример, который решает обе проблемы, находится здесь: https://gist.github.com/algal/09b08515460b7bd229fa.
extension Date {
init(_ dateString:String) {
let dateStringFormatter = DateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd"
dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
let date = dateStringFormatter.date(from: dateString)!
self.init(timeInterval:0, since:date)
}
}
Swift не имеет собственного типа Date, но вы должны использовать существующий тип Cocoa NSDate
, например:
class Date {
class func from(year: Int, month: Int, day: Int) -> Date {
let gregorianCalendar = NSCalendar(calendarIdentifier: .gregorian)!
var dateComponents = DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = day
let date = gregorianCalendar.date(from: dateComponents)!
return date
}
class func parse(_ string: String, format: String = "yyyy-MM-dd") -> Date {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = NSTimeZone.default
dateFormatter.dateFormat = format
let date = dateFormatter.date(from: string)!
return date
}
}
Что вы можете использовать как:
var date = Date.parse("2014-05-20")
var date = Date.from(year: 2014, month: 05, day: 20)
Вот как я это сделал в Swift 4.2:
extension Date {
/// Create a date from specified parameters
///
/// - Parameters:
/// - year: The desired year
/// - month: The desired month
/// - day: The desired day
/// - Returns: A 'Date' object
static func from(year: Int, month: Int, day: Int) -> Date? {
let calendar = Calendar(identifier: .gregorian)
var dateComponents = DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = day
return calendar.date(from: dateComponents) ?? nil
}
}
Использование:
let marsOpportunityLaunchDate = Date.from(year: 2003, month: 07, day: 07)
Согласно документация Apple
Пример:
var myObject = NSDate()
let futureDate = myObject.dateByAddingTimeInterval(10)
let timeSinceNow = myObject.timeIntervalSinceNow
В, Swift 3.0 вы установили объект даты таким образом.
extension Date
{
init(dateString:String) {
let dateStringFormatter = DateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd"
dateStringFormatter.locale = Locale(identifier: "en_US_POSIX")
let d = dateStringFormatter.date(from: dateString)!
self(timeInterval:0, since:d)
}
}
Лично я думаю, что это должен быть неудачный инициализатор:
extension Date {
init?(dateString: String) {
let dateStringFormatter = DateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd"
if let d = dateStringFormatter.date(from: dateString) {
self.init(timeInterval: 0, since: d)
} else {
return nil
}
}
}
В противном случае строка с недопустимым форматом вызовет исключение.
В соответствии с ответом @mythz я решил опубликовать обновленную версию своего расширения с помощью синтаксиса swift3
.
extension Date {
static func from(_ year: Int, _ month: Int, _ day: Int) -> Date?
{
let gregorianCalendar = Calendar(identifier: .gregorian)
let dateComponents = DateComponents(calendar: gregorianCalendar, year: year, month: month, day: day)
return gregorianCalendar.date(from: dateComponents)
}
}
Я не использую метод parse
, но если кому-то это нужно, я обновлю этот пост.
Мне часто приходится комбинировать значения даты из одного места со значениями времени для другого. Я написал вспомогательную функцию, чтобы выполнить это.
let startDateTimeComponents = NSDateComponents()
startDateTimeComponents.year = NSCalendar.currentCalendar().components(NSCalendarUnit.Year, fromDate: date).year
startDateTimeComponents.month = NSCalendar.currentCalendar().components(NSCalendarUnit.Month, fromDate: date).month
startDateTimeComponents.day = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: date).day
startDateTimeComponents.hour = NSCalendar.currentCalendar().components(NSCalendarUnit.Hour, fromDate: time).hour
startDateTimeComponents.minute = NSCalendar.currentCalendar().components(NSCalendarUnit.Minute, fromDate: time).minute
let startDateCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
combinedDateTime = startDateCalendar!.dateFromComponents(startDateTimeComponents)!