Como criar um objecto de data swift

como se cria um objecto de data a partir de uma data no swift xcode.

Eg em javascript você faria: var day = new Date('2014-05-20');

Author: gbk, 2014-06-07

8 answers

Swift tem seu próprio tipo Date. Não é necessário utilizar NSDate.

A criar uma data e hora no Swift.

No Swift, as datas e horas são armazenadas num número de vírgula flutuante de 64 bits, medindo o número de segundos desde a data de referência de 1 de janeiro de 2001 em 00:00:00 UTC. Isto é expresso na Date estrutura O seguinte dar-lhe-á a data e hora actuais:

let currentDateTime = Date()

Para criar outras datas, você pode usar um dos seguinte.

Método 1

Se souberes o número de segundos antes ou depois da data de referência de 2001, podes usar isso.

let someDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM

Método 2

Claro, seria mais fácil usar coisas como anos, meses, dias e horas (em vez de segundos relativos) para fazer um Date. Para isso, você pode usar DateComponents para especificar os componentes e então Calendar para criar a data. O {[9] } dá o contexto Date. Caso contrário, como saberia o quê? Fuso horário ou calendário para expressá-lo?

// 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)

Outras abreviaturas do fuso horário podem ser encontradas aqui. Se você deixar isso em branco, então o padrão é usar o fuso horário do Usuário.

Método 3

A maneira mais sucinta (mas não necessariamente a melhor) poderia ser usar DateFormatter.

let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let someDateTime = formatter.date(from: "2016/10/08 22:31")

As normas técnicas Unicode mostram outros formatos que DateFormatter suportam.

Notas

Ver a minha resposta completa para como mostra a data e a hora num formato legível. Leia também estes excelentes artigos:

 148
Author: Suragch, 2017-12-06 04:33:41

Isto é melhor feito usando uma extensão para a classe NSDate existente.

A seguinte extensão adiciona um novo inicializador que irá criar uma data no local actual, usando o texto de data no formato que indicou.

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)
    }
 }
Agora você pode criar um NSDate da Swift apenas fazendo:
NSDate(dateString:"2014-06-06")

Por favor, note que esta implementação não cache O Nsdatformatter, o que você pode querer fazer por razões de desempenho se você espera estar criando muitos NSDates neste forma.

Lembre-se também que esta implementação irá simplesmente falhar se tentar inicializar um NSDate passando por um texto que não pode ser processado correctamente. Isto deve-se ao desembrulhamento forçado do valor opcional devolvido por dateFromString. Se você quisesse devolver um nil em malhas, você preferiria usar um inicializador falível; mas você não pode fazer isso agora (junho de 2015), por causa de uma limitação no Swift 1.2, então você é a próxima melhor escolha é usar um método de fábrica de classe.

Mais um exemplo elaborado, que aborda ambas as questões, está aqui: https://gist.github.com/algal/09b08515460b7bd229fa

 107
Author: algal, 2015-06-22 20:47:26

A Swift não tem o seu próprio tipo de Data, mas você deve usar o tipo de cacau existente NSDate, p. ex.:

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
    }
}

Que pode usar como:

var date = Date.parse("2014-05-20")
var date = Date.from(year: 2014, month: 05, day: 20)
 43
Author: mythz, 2016-12-05 22:29:44

De acordo com a documentação da Apple

Exemplo:

var myObject = NSDate()
let futureDate = myObject.dateByAddingTimeInterval(10)
let timeSinceNow = myObject.timeIntervalSinceNow
 4
Author: thedjnivek, 2014-06-06 20:26:56

In, Swift 3.0 você definiu objeto de data para este modo.

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)
    }
}
 3
Author: Jaydip, 2017-03-08 08:07:08
Pessoalmente, acho que deve ser um inicializador falível.
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
        }
    }
}

Caso contrário, um texto com um formato inválido irá criar uma excepção.

 2
Author: Leon, 2017-03-24 10:18:55

De acordo com a resposta de @mythz, eu decido publicar a versão atualizada da sua extensão usando a sintaxe 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)
    }
}

Eu não USO O Método {[[2]}, mas se alguém precisar, eu vou atualizar este post.

 2
Author: Hamsternik, 2017-05-23 17:18:38

Tenho frequentemente a necessidade de combinar valores de data de um local com valores de tempo de outro. Escrevi uma função auxiliar para conseguir isto.

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)!
 1
Author: Justin Domnitz, 2015-08-18 14:31:31