Je suis en train de faire la différence entre la date actuelle comme NSDate()
et une date à partir d' un PHP time();
appel par exemple: NSDate(timeIntervalSinceReferenceDate: 1417147270)
. Comment puis-je obtenir la différence de temps entre les deux dates. Je voudrais avoir une fonction qui compare les deux dates, if(seconds > 60)
puis elle renvoie les minutes, les if(minutes > 60)
heures de if(hours > 24)
retour et les jours de retour, etc.
Comment dois-je procéder?
EDIT: La réponse actuellement acceptée a fait exactement ce que je voulais faire. Je le recommande pour une utilisation facile pour obtenir le temps entre deux dates sous la forme utilisée par la time()
fonction PHP . Si vous n'êtes pas particulièrement familier avec PHP, c'est le temps en secondes à partir du 1er janvier 1970. Ceci est bénéfique pour un backend en PHP. Si vous utilisez peut-être un backend comme NodeJS, vous voudrez peut-être envisager certaines des autres options que vous trouverez ci-dessous.
NSDateComponentsFormatter
. Il est très configurable, vous permettant d'obtenir des résultats concis de manière appropriée (par exemple.maximumUnitCount = 1
).Réponses:
Xcode 8.3 • Swift 3.1 ou version ultérieure
Vous pouvez utiliser Calendrier pour vous aider à créer une extension pour effectuer vos calculs de date comme suit:
Utilisation du formateur de composants de date
la source
.CalendarUnitSecond
donne une erreur'NSCalendarUnit.Type' does not have a member named 'CalendarUnitSecond'
, savez-vous comment le résoudre?NSCalendarUnit
, implémentée commereturn Calendar.current().components(unit, from: date, to: self, options: [])?. valueForComponent(unit)
(sur iOS> 8).DateComponentsFormatter
est tellement mieux que de le faire à long terme, cela devrait vraiment être en haut de la réponse.Si quelqu'un a besoin d'afficher toutes les unités de temps, par exemple "heures minutes secondes" et pas seulement "heures". Disons que la différence de temps entre deux dates est de 1 heure 59 minutes 20 secondes. Cette fonction affichera "1h 59m 20s".
Voici mon code Objective-C:
Dans Swift 3+:
la source
Tu demandes:
Je suppose que vous essayez de construire une représentation sous forme de chaîne du temps écoulé entre deux dates. Plutôt que d'écrire votre propre code pour ce faire, Apple a déjà une classe conçue précisément pour cela. À savoir, utilisez
DateComponentsFormatter
, définissezallowedUnits
les valeurs qui conviennent à votre application, définissezunitsStyle
ce que vous voulez (par exemple.full
), puis appelezstring(from:to:)
.Par exemple, dans Swift 3:
Cela localisera également la chaîne appropriée pour le périphérique en question.
Ou, dans Swift 2.3:
Si vous recherchez les valeurs numériques réelles, utilisez simplement
dateComponents
. Par exemple, dans Swift 3:Ou, dans Swift 2.3:
la source
Extension + DateComponentsFormatter combinés de la réponse de @ leo-dabus
Xcode 8.3 • Swift 3.1
la source
la source
J'ai ajouté une version "longue" à la réponse de Leo Dabus au cas où vous voudriez avoir une chaîne qui dit quelque chose comme "il y a 2 semaines" au lieu de "2w" ...
la source
-> Utilisez-le pour trouver l'intervalle de temps entre deux dates dans Swift (avec deux cordes).
la source
Code légèrement modifié pour Swift 3.0
la source
Swift 5.1 • iOS 13
Vous pouvez utiliser RelativeDateFormatter qui a été introduit par Apple dans iOS 13.
Voir Comment afficher une date et une heure relatives à l'aide de RelativeDateTimeFormatter .
la source
Si votre objectif est d'obtenir le numéro de jour exact entre deux dates, vous pouvez contourner ce problème comme suit:
la source
Avec Swift 3, selon vos besoins, vous pouvez choisir l'une des deux façons suivantes pour résoudre votre problème.
1. Afficher la différence entre deux dates à l'utilisateur
Vous pouvez utiliser un
DateComponentsFormatter
pour créer des chaînes pour l'interface de votre application.DateComponentsFormatter
a unemaximumUnitCount
propriété avec la déclaration suivante:En définissant
maximumUnitCount
la valeur de sur1
, vous êtes assuré d'afficher la différence dans un seulDateComponentsFormatter
unité (années, mois, jours, heures ou minutes).Le code Playground ci-dessous montre comment afficher la différence entre deux dates:
Notez que
DateComponentsFormatter
arrondit le résultat. Par conséquent, une différence de 4 heures et 30 minutes sera affichée comme 5 heures .Si vous devez répéter cette opération, vous pouvez refactoriser votre code:
2. Obtenez la différence entre deux dates sans formatage
Si vous n'avez pas besoin d'afficher avec mise en forme la différence entre deux dates pour l'utilisateur, vous pouvez l'utiliser
Calendar
.Calendar
a une méthodedateComponents(_:from:to:)
qui a la déclaration suivante:Le code Playground ci-dessous qui utilise
dateComponents(_:from:to:)
montre comment récupérer la différence entre deux dates en renvoyant la différence dans un seul type deCalendar.Component
(années, mois, jours, heures ou minutes).Si vous devez répéter cette opération, vous pouvez refactoriser votre code:
la source
Dans Swift 2.2
la source
Un petit ajout à la réponse de Leo Dabus pour fournir les versions plurielles et être plus lisible par l'homme.
Swift 3
la source
Ceci est la version la plus courte: Essentiellement, j'essaie de faire la différence entre l'horodatage du post et le
Date()
now.la source
Voici ma réponse pour les réponses Swift 3 ci-dessus. Ceci est à jour en novembre 2016, la version Xcode était 8.2 Beta (8C23). J'ai utilisé certaines des suggestions Sagar et Emin ci-dessus et j'ai parfois dû laisser Xcode compléter automatiquement pour suggérer la syntaxe. Il semblait que la syntaxe a vraiment changé pour cette version bêta.
buyDate
Je viens d'un DatePicker:la source
NSCalendar
dans Swift 3. UtilisezCalendar
. Donc, cela est simplifiélet calendar = Calendar.current
. Et puiscomponents
ressemblerait à :let components = calendar.dateComponents([.day], from: date1, to: date2)
.Pour XCode version 8.3.3 et Swift 3.0:
la source
Certains ajouts dans jose920405 répondent pour le rendre compatible avec Swift 3.0 et supérieur
la source
Utilisez ce code:
La sortie est: Résultat: 10 ans 1 mois et 18 jours
la source
Utilisation:
la source