Nano Hash - криптовалюты, майнинг, программирование

Рассчитать продолжительность между датой ios в годах, месяцах и формате даты

Я новичок в быстром программировании, и мне не удалось успешно найти код, чтобы найти разницу между двумя датами с точки зрения лет, месяцев и дней. Я пробовал следующий код, но он не работал

let form = NSDateComponentsFormatter()
form.maximumUnitCount = 2
form.unitsStyle = .Full
let s = form.stringFromTimeInterval( date2.timeIntervalSinceReferenceDate - date1.timeIntervalSinceReferenceDate)

Вход

Дата1 = "12 марта 2015 г."

Дата2 = "1 июня 2015 г."

Выход: x лет y месяцев z дней

Пожалуйста посоветуй

18.11.2015

  • это не соответствует моим потребностям бесполезно в качестве описания проблемы. Пожалуйста, покажите ваши точные входные данные, ожидаемый результат и фактический результат. 18.11.2015
  • И stringFromTimeInterval бесполезен, потому что выбрасывает ценную информацию. 29 дней — это иногда один месяц плюс один день, иногда один месяц, иногда просто 29 дней. 18.11.2015
  • @vikingosegundo: указанная ветка не объясняет, как правильно используется NSDateComponentsFormatter, поэтому я бы не стал рассматривать это как дубликат. 18.11.2015
  • @MartinR: возможно, вы правы, но на самом деле заголовок и тело вопроса не совпадают. Получение правильных компонентов и их форматирование в любом случае являются двумя разными и независимыми вещами. 18.11.2015

Ответы:


1

Если вам нужна разница (в годах, месяцах, днях) численно, тогда вычислите NSDateComponents как в Быстрые дни между два NSDates или ответ Раджана.

Если вам нужна разница в виде (локализованной) строки, чтобы представить ее пользователю, используйте NSDateComponentsFormatter, как это

let form = NSDateComponentsFormatter()
form.maximumUnitCount = 2
form.unitsStyle = .Full
form.allowedUnits = [.Year, .Month, .Day]
let s = form.stringFromDate(date1, toDate: date2)

Как уже упоминалось в комментариях, вычисление разницы из чистого интервала времени между датами не может дать правильных результатов, поскольку теряется большая часть информации о датах.

Обновление для Swift 3:

let form = DateComponentsFormatter()
form.maximumUnitCount = 2
form.unitsStyle = .full
form.allowedUnits = [.year, .month, .day]
let s = form.string(from: date1, to: date2)
18.11.2015
  • Спасибо за ответы. Один последний запрос, если мне нужно отделить цифры года, месяца и дня от строки, есть ли встроенная функция или мне нужно пройти через строку одну за другой. Например: s = 1 год 2 месяца 3 дня, как проще всего извлечь 1,2 и 3 18.11.2015
  • @alanvabraham: Как я уже сказал, если вам нужен числовой год/месяц/день, вам лучше использовать NSDateComponents, как в stackoverflow.com/questions/24723431/ или ответ Раджана, а не NSDateComponentsFormatter. 18.11.2015
  • в ответе выше s возвращается, например: 1 год 2 месяца 3 дня. мне нравится знать, есть ли какая-либо функция для извлечения этих чисел из строки. Я понимаю, что функция разрешенных единиц вернет отдельные единицы, но ответ в обоих случаях не одинаков. 23.11.2015

  • 2

    Мы можем использовать эту функцию в Swift 2.0.

    func yearsBetweenDate(startDate: NSDate, endDate: NSDate) -> Int
    {
        let calendar = NSCalendar.currentCalendar()
    
        let components = calendar.components([.Year], fromDate: startDate, toDate: endDate, options: [])
    
        return components.year
    }
    

    Вы можете вернуть все, что я вернул год в этой функции. Это вернет количество лет между двумя датами.
    Вы можете просто написать месяцы, дни и т. д., чтобы найти разницу между двумя датами в месяцах и днях соответственно.

    Изменить

    Swift 3.0 и выше

    func yearsBetweenDate(startDate: Date, endDate: Date) -> Int {
    
        let calendar = Calendar.current
    
        let components = calendar.dateComponents([.year], from: startDate, to: endDate)
    
        return components.year!
    }
    
    18.11.2015

    3

    В Swift 5 и iOS 12 вы можете использовать одно из трех приведенных ниже решений, чтобы вычислить разницу (в годах, месяцах, днях) между двумя датами.


    №1. Использование метода dateComponents(_:from:to:) Calendar

    Calendar имеет метод с именем dateComponents(_:from:to:). dateComponents(_:from:to:) имеет следующее объявление:

    func dateComponents(_ components: Set<Calendar.Component>, from start: DateComponents, to end: DateComponents) -> DateComponents
    

    Возвращает разницу между двумя датами, указанными как DateComponents.

    Пример Playground ниже показывает, как использовать dateComponents(_:from:to:) для вычисления разницы между двумя датами:

    import Foundation
    
    let calendar = Calendar.current
    let startComponents = DateComponents(year: 2010, month: 11, day: 22)
    let endComponents = DateComponents(year: 2015, month: 5, day: 1)
    
    let dateComponents = calendar.dateComponents([.year, .month, .day], from: startComponents, to: endComponents)
    print(dateComponents) // prints: year: 4 month: 5 day: 9 isLeapMonth: false
    

    № 2. Использование метода dateComponents(_:from:to:) Calendar

    Calendar имеет метод с именем dateComponents(_:from:to:). dateComponents(_:from:to:) имеет следующее объявление:

    func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents
    

    Возвращает разницу между двумя датами.

    Пример Playground ниже показывает, как использовать dateComponents(_:from:to:) для вычисления разницы между двумя датами:

    import Foundation
    
    let calendar = Calendar.current
    let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
    let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
    
    let dateComponents = calendar.dateComponents([.year, .month, .day], from: startDate, to: endDate)
    print(dateComponents) // prints: year: 4 month: 5 day: 9 isLeapMonth: false
    

    №3. Использование метода string(from:to:) DateComponentsFormatter

    DateComponentsFormatter имеет метод с именем string(from:to:). string(from:to:) имеет следующее объявление:

    func string(from startDate: Date, to endDate: Date) -> String?
    

    Возвращает отформатированную строку на основе разницы во времени между двумя датами.

    Пример Playground ниже показывает, как использовать string(from:to:) для вычисления разницы между двумя датами:

    import Foundation
    
    let calendar = Calendar.current
    let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
    let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
    
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full
    formatter.allowedUnits = [.year, .month, .day]
    let string = formatter.string(from: startDate, to: endDate)!
    print(string) // prints: 4 years, 5 months, 9 days
    
    08.10.2018

    4

    Попробуй это

    func calculateDiffInTwoDate (date1: NSDate, date2: NSDate) -> NSInteger {
    
            //var userAge : NSInteger = 0
            let calendar : NSCalendar = NSCalendar.currentCalendar()
            let unitFlags : NSCalendarUnit = [ .Year , .Month, .Day]
            let dateComponentNow : NSDateComponents = calendar.components(unitFlags, fromDate: date2)
            let dateComponentBirth : NSDateComponents = calendar.components(unitFlags, fromDate: date1)
    
            if ( (dateComponentNow.month < dateComponentBirth.month) ||
                ((dateComponentNow.month == dateComponentBirth.month) && (dateComponentNow.day < dateComponentBirth.day))
                )
            {
                return dateComponentNow.year - dateComponentBirth.year - 1
            }
            else {
                return dateComponentNow.year - dateComponentBirth.year
            }
        }
    

    По этому вы можете получить разницу между двумя датами в годах

    18.11.2015
  • Почему ты так усложняешь? NSCalendar может рассчитать компоненты от одной даты до другой даты. компоненты: fromDate: toDate: параметры:. 18.11.2015

  • 5

    Почему бы вам не использовать встроенный метод, чтобы найти разницу между двумя датами в секундах, а затем написать метод для преобразования секунд в годы, месяцы и дни.

    let diff = date1.timeIntervalSinceDate(date2)
    
    18.11.2015
  • См. мой комментарий выше - при расчете временного интервала в секундах вы теряете информацию. Месяцы должны иметь разную длину. Так же и дни. Так же и годы. 18.11.2015
  • Тогда вы должны использовать ответ Раджана ниже. 18.11.2015

  • 6
  • Этот код поможет вам рассчитать и вернуть рассчитанную разницу двух дат, или мы можем сказать дату рождения. 05.11.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..