Eu estou tentando obter a diferença entre a data atual como NSDate()
e uma data de um PHP time();
chamada, por exemplo: NSDate(timeIntervalSinceReferenceDate: 1417147270)
. Como faço para obter a diferença de tempo entre as duas datas. Eu gostaria de ter uma função que compara as duas datas e, em if(seconds > 60)
seguida, retorna minutos, if(minutes > 60)
horas de if(hours > 24)
retorno e dias de retorno e assim por diante.
Como devo fazer isso?
EDIT: A resposta aceita atualmente fez exatamente o que eu queria fazer. Eu o recomendo para facilitar o uso, para obter o tempo entre duas datas no formato time()
usado pela função PHP . Se você não está familiarizado com o PHP, esse é o tempo em segundos a partir de 1º de janeiro de 1970. Isso é benéfico para um back-end em PHP. Se talvez você esteja usando um back-end como o NodeJS, considere algumas das outras opções abaixo.
NSDateComponentsFormatter
. É muito configurável, permitindo obter resultados adequadamente concisos (por exemplo.maximumUnitCount = 1
).Respostas:
Xcode 8.3 • Swift 3.1 ou posterior
Você pode usar o Google Agenda para ajudá-lo a criar uma extensão para fazer seus cálculos de datas da seguinte maneira:
Usando o Formatador de Componentes de Data
fonte
.CalendarUnitSecond
dá erro'NSCalendarUnit.Type' does not have a member named 'CalendarUnitSecond'
, você sabe como resolvê-lo?NSCalendarUnit
, implementado comoreturn Calendar.current().components(unit, from: date, to: self, options: [])?. valueForComponent(unit)
(no iOS> 8).DateComponentsFormatter
é MUITO melhor do que fazer o caminho longo, isso realmente deve estar no topo da resposta.Se alguém precisar exibir todas as unidades de tempo, por exemplo, "horas minutos segundos" e não apenas "horas". Digamos que a diferença horária entre duas datas seja de 1 hora 59 minutos 20 segundos. Esta função exibirá "1h 59m 20s".
Aqui está o meu código Objective-C:
No Swift 3+:
fonte
Você pergunta:
Suponho que você esteja tentando criar uma representação em cadeia do tempo decorrido entre duas datas. Em vez de escrever seu próprio código para fazer isso, a Apple já possui uma classe projetada para fazer exatamente isso. Ou seja, use
DateComponentsFormatter
, defina osallowedUnits
valores que fizerem sentido para o seu aplicativo, defina ounitsStyle
que você quiser (por exemplo.full
) e, em seguida, liguestring(from:to:)
.Por exemplo, no Swift 3:
Isso também localizará a sequência apropriada para o dispositivo em questão.
Ou, no Swift 2.3:
Se você estiver procurando os valores numéricos reais, use
dateComponents
. Por exemplo, no Swift 3:Ou, no Swift 2.3:
fonte
combinado Extension + DateComponentsFormatter da resposta de @ leo-dabus
Xcode 8.3 • Swift 3.1
fonte
fonte
Adicionei uma versão "longa" à resposta de Leo Dabus, caso você queira ter uma string que diga algo como "2 semanas atrás" em vez de apenas "2w" ...
fonte
-> Use isso para encontrar um intervalo de tempo entre duas datas no Swift (com duas cordas).
fonte
Código ligeiramente modificado para Swift 3.0
fonte
Swift 5.1 • iOS 13
Você pode usar o RelativeDateFormatter que foi introduzido pela Apple no iOS 13.
Consulte Como mostrar uma data e hora relativa usando RelativeDateTimeFormatter .
fonte
Se seu objetivo é obter o número exato do dia entre duas datas, você pode solucionar esse problema da seguinte maneira:
fonte
Com o Swift 3, de acordo com suas necessidades, você pode escolher uma das duas maneiras a seguir para resolver seu problema.
1. Exiba a diferença entre duas datas para o usuário
Você pode usar a
DateComponentsFormatter
para criar strings para a interface do seu aplicativo.DateComponentsFormatter
possui umamaximumUnitCount
propriedade com a seguinte declaração:Ao definir
maximumUnitCount
o valor como1
, você garante a exibição da diferença em apenas umaDateComponentsFormatter
unidade (anos, meses, dias, horas ou minutos).O código do Playground abaixo mostra como exibir a diferença entre duas datas:
Observe que
DateComponentsFormatter
arredonda o resultado. Portanto, uma diferença de 4 horas e 30 minutos será exibida como 5 horas .Se precisar repetir esta operação, você pode refatorar seu código:
2. Obtenha a diferença entre duas datas sem formatação
Se você não precisar exibir com formatação a diferença entre duas datas para o usuário, poderá usar
Calendar
.Calendar
possui um métododateComponents(_:from:to:)
que possui a seguinte declaração:O código do Playground abaixo que usa
dateComponents(_:from:to:)
mostra como recuperar a diferença entre duas datas retornando a diferença em apenas um tipo deCalendar.Component
(anos, meses, dias, horas ou minutos).Se precisar repetir esta operação, você pode refatorar seu código:
fonte
No Swift 2.2
fonte
Uma pequena adição à resposta de Leo Dabus para fornecer as versões plurais e ser mais legível para humanos.
Swift 3
fonte
Esta é a versão mais curta: Basicamente, tento obter a diferença entre o carimbo de data e hora do post e o
Date()
agora.fonte
Aqui está a minha resposta para as respostas do Swift 3 acima. Atual em novembro de 2016, a versão do Xcode era 8.2 Beta (8C23). Usou algumas das sugestões de Sagar e Emin acima e, às vezes, precisava deixar o Xcode preencher automaticamente para sugerir a sintaxe. Parecia que a sintaxe realmente mudou para esta versão beta.
buyDate
Eu recebi de um DatePicker:fonte
NSCalendar
Swift 3. UseCalendar
. Então, isso é simplificado paralet calendar = Calendar.current
. E entãocomponents
seria algo como:let components = calendar.dateComponents([.day], from: date1, to: date2)
.Para o XCode versão 8.3.3 e Swift 3.0:
fonte
Alguma adição na resposta jose920405 para torná-lo compatível com o Swift 3.0 e superior
fonte
Use este código:
A produção é: Resultado: 10 anos 1 mês e 18 dias
fonte
Usar:
fonte