Estou me perguntando se há alguma possibilidade nova e incrível de obter a quantidade de dias entre dois NSDates em Swift / o "novo" Cocoa?
Por exemplo, como em Ruby, eu faria:
(end_date - start_date).to_i
ios
swift
date
date-difference
Linus
fonte
fonte
Respostas:
Você também deve considerar a diferença de fuso horário. Por exemplo, se você comparar as datas
2015-01-01 10:00
e2015-01-02 09:00
, os dias entre essas datas retornarão como 0 (zero), pois a diferença entre essas datas é menor que 24 horas (é 23 horas).Se o seu objetivo é obter o número exato do dia entre duas datas, você pode contornar esse problema desta forma:
Versão Swift 3 e Swift 4
fonte
calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: firstDate))
startOfDay()
parece ser desnecessário):calendar.date(bySettingHour: 12, minute: 0, second: 0, of: firstDate)
.Aqui está minha resposta para o Swift 2:
fonte
today
etomorrow
Vejo algumas respostas do Swift3, então vou adicionar as minhas:
A nomenclatura parece mais rápida, é uma linha e usa o
dateComponents()
método mais recente .fonte
Traduzi minha resposta Objective-C
resultado
A parte mais difícil é que o autocompletar insiste em fromDate e toDate seria
NSDate?
, mas na verdade eles devem serNSDate!
conforme mostrado na referência.Não vejo como seria uma boa solução com um operador, já que você deseja especificar a unidade de forma diferente em cada caso. Você poderia retornar o intervalo de tempo, mas não ganhará muito.
fonte
.DayCalendarUnit
está obsoleto. Eu acredito que agora você deve usar em seu.CalendarUnitDay
lugar.let components = cal.components(.Day, fromDate: startDate, toDate: endDate, options: [])
.Day
agora mesmoAqui é muito bom,
Date
extensão para obter diferença entre datas em anos, meses, dias, horas, minutos, segundosfonte
date
deve estarsinceDate
em parâmetros de função.days
e funciona bem.func years(since date: Date) -> Int? { return Calendar.current.dateComponents[.year], from: date, to: self).years }
, e você poderia chamá-lo delet y = date1.years(since: date2)
. Isso pode ser mais consistente com as convenções de nomenclatura modernas.Atualização para Swift 3 iOS 10 Beta 4
fonte
Aqui está a resposta para Swift 3 (testado para IOS 10 Beta)
Então você pode chamá-lo assim
fonte
Swift 3. Obrigado a Emin Buğra Saral acima pela
startOfDay
sugestão.Uso:
fonte
As coisas embutidas no Swift ainda são muito básicas. Como deveriam estar nesta fase inicial. Mas você pode adicionar suas próprias coisas com o risco de sobrecarregar operadores e funções de domínio global. Eles serão locais para o seu módulo.
fonte
Aqui está minha resposta para o Swift 3:
fonte
Quase não existe nenhuma biblioteca padrão específica do Swift ainda; apenas os tipos básicos de números, strings e coleções.
É perfeitamente possível definir essas abreviações usando extensões, mas no que diz respeito às APIs prontas para usar, não existe um "novo" Cocoa; O Swift apenas mapeia diretamente para as mesmas APIs Cocoa antigas e verbosas, conforme já existem.
fonte
Vou adicionar minha versão, embora este tópico tenha um ano. Meu código é parecido com este:
Eu espero que isso ajude alguém.
Felicidades,
fonte
Método de Erin atualizado para Swift 3, mostra os dias a partir de hoje (desconsiderando a hora do dia)
fonte
Isso retorna uma diferença absoluta em dias entre alguns
Date
e hoje:e então usá-lo:
fonte
Você pode usar a seguinte extensão:
Então, você pode chamá-lo assim:
fonte
Swift 3.2
fonte
Todas as respostas são boas. Mas, para localizações, precisamos calcular um número de dias decimais entre duas datas. para que possamos fornecer o formato decimal sustentável.
fonte
Então use como
fonte
Esta é uma versão atualizada da resposta de Emin para o Swift 5 que incorpora a sugestão de usar meio-dia em vez de meia-noite como horário definitivo para comparar dias. Ele também lida com a falha potencial de várias funções de data retornando um opcional.
fonte
Swift 3 - dias de hoje até a data
Chamar função como esta
fonte
opção mais fácil seria criar uma extensão em Date
fonte
se precisar de ano, mês, dias e horas como string, use este
var tomorrow = Calendar.current.date (byAdding: .day, value: 1, to: Date ())!
deixe dc = tomorrow.completeOffset (de: Data ())
fonte
Bom forro prático:
fonte
fonte
Solução Swift 5.2.4:
fonte
Versão 2017, copie e cole
fonte
fonte