Я пытаюсь получить разницу между текущей датой в качестве NSDate()
и даты от PHP time();
вызова, например: NSDate(timeIntervalSinceReferenceDate: 1417147270)
. Как мне узнать разницу во времени между двумя датами? Я хотел бы иметь функцию, которая сравнивает две даты, а if(seconds > 60)
затем возвращает минуты, if(minutes > 60)
часы if(hours > 24)
возврата и дни возврата и так далее.
Как я должен идти об этом?
РЕДАКТИРОВАТЬ: текущий принятый ответ сделал именно то, что я хотел сделать. Я рекомендую его для простоты использования для получения времени между двумя датами в форме, которую time()
использует функция PHP . Если вы не особенно знакомы с PHP, это время в секундах с 1 января 1970 года. Это полезно для бэкэнда в PHP. Если, возможно, вы используете бэкэнд, такой как NodeJS, вы можете рассмотреть некоторые другие варианты, которые вы найдете ниже.
NSDateComponentsFormatter
. Это очень настраиваемый, что позволяет вам получить соответственно краткие результаты (например.maximumUnitCount = 1
).Ответы:
Xcode 8.3 • Swift 3.1 или более поздняя версия
Вы можете использовать Календарь, чтобы помочь вам создать расширение для вычисления даты следующим образом:
Использование компонента форматирования даты
источник
.CalendarUnitSecond
выдает ошибку'NSCalendarUnit.Type' does not have a member named 'CalendarUnitSecond'
, знаете как ее решить?NSCalendarUnit
, реализованный какreturn Calendar.current().components(unit, from: date, to: self, options: [])?. valueForComponent(unit)
(на iOS> 8).DateComponentsFormatter
НАМНОГО лучше, чем проделывать долгий путь, это действительно должно быть в верхней части ответа.Если кому-то нужно отобразить все единицы времени, например, «часы, минуты, секунды», а не только «часы». Допустим, разница во времени между двумя датами составляет 1 час 59 минут 20 секунд. Эта функция будет отображать «1 ч 59 м 20 с».
Вот мой код Objective-C:
В Swift 3+:
источник
Ты спрашиваешь:
Я предполагаю, что вы пытаетесь построить строковое представление прошедшего времени между двумя датами. Вместо того, чтобы писать собственный код для этого, у Apple уже есть класс, предназначенный именно для этого. А именно, используйте
DateComponentsFormatter
, установитеallowedUnits
любые значения, которые имеют смысл для вашего приложения, установитеunitsStyle
все, что вы хотите (например.full
), и затем вызовитеstring(from:to:)
.Например, в Swift 3:
Это также локализует строку, соответствующую данному устройству.
Или в Swift 2.3:
Если вы ищете фактические числовые значения, просто используйте
dateComponents
. Например, в Swift 3:Или в Swift 2.3:
источник
комбинированный Extension + DateComponentsFormatter из ответа @ leo-dabus
Xcode 8.3 • Swift 3.1
источник
источник
Я добавил «длинную» версию в ответ Лео Дабуса на тот случай, если вы хотите иметь строку, которая говорит что-то вроде «2 недели назад» вместо просто «2w» ...
источник
-> Используйте это, чтобы найти промежуток времени между двумя датами в Swift (с двумя строками).
источник
Слегка измененный код для Swift 3.0
источник
Swift 5.1 • iOS 13
Вы можете использовать RelativeDateFormatter , который был представлен Apple в iOS 13.
См. Как показать относительную дату и время, используя RelativeDateTimeFormatter .
источник
Если ваша цель - получить точное число дней между двумя датами, вы можете обойти эту проблему следующим образом:
источник
С Swift 3, в соответствии с вашими потребностями, вы можете выбрать один из двух следующих способов решения вашей проблемы.
1. Показать разницу между двумя датами для пользователя
Вы можете использовать
DateComponentsFormatter
для создания строк для интерфейса вашего приложения.DateComponentsFormatter
имеетmaximumUnitCount
свойство со следующим объявлением:Установив
maximumUnitCount
значение в1
, вы гарантированно отобразите разницу только в однойDateComponentsFormatter
единице (годы, месяцы, дни, часы или минуты).Код игровой площадки ниже показывает, как отобразить разницу между двумя датами:
Обратите внимание, что
DateComponentsFormatter
округляет результат. Следовательно, разница в 4 часа и 30 минут будет отображаться как 5 часов. .Если вам нужно повторить эту операцию, вы можете изменить свой код:
2. Получите разницу между двумя датами без форматирования
Если вам не нужно отображать с форматированием разницу между двумя датами для пользователя, вы можете использовать
Calendar
.Calendar
имеет метод,dateComponents(_:from:to:)
который имеет следующую декларацию:Приведенный ниже код игровой площадки
dateComponents(_:from:to:)
показывает, как извлечь разницу между двумя датами, возвращая разницу только в одном типеCalendar.Component
(годы, месяцы, дни, часы или минуты).Если вам нужно повторить эту операцию, вы можете изменить свой код:
источник
В Swift 2.2
источник
Небольшое дополнение к ответу Лео Дабуса, чтобы обеспечить множественные версии и быть более читабельным.
Свифт 3
источник
Это более короткая версия: в основном я пытаюсь получить разницу между отметкой времени после записи и
Date()
сейчас.источник
Вот мой ответ на Swift 3 ответы выше. Это актуально на ноябрь 2016 года, выпуск XCode был 8,2 бета (8C23). Использовал некоторые из предложений Sagar и Emin, описанных выше, и иногда приходилось разрешать автозаполнению Xcode, чтобы предложить синтаксис. Казалось, что синтаксис действительно изменился на эту бета-версию.
buyDate
Я получил от DatePicker:источник
NSCalendar
в Swift 3. ИспользуйтеCalendar
. Так что это упрощено доlet calendar = Calendar.current
. И тогдаcomponents
будет выглядеть так:let components = calendar.dateComponents([.day], from: date1, to: date2)
.Для XCode версии 8.3.3 и Swift 3.0:
источник
Некоторое дополнение в ответе jose920405, чтобы сделать его совместимым с Swift 3.0 и выше
источник
Используйте этот код:
Выход: Результат: 10 лет 1 месяц и 18 дней
источник
Использование:
источник