Получить общее количество месяцев между 2 датами в Swift - PullRequest
2 голосов
/ 03 марта 2020

как получить общий месяц между 2 датами? вот обычный способ получить дату

1) startDate: 2020-2-22 10: 25: 00

2) endDate: 2020-3-3 12: 34: 00

let diffInDate:Int = Calendar.current.dateComponents([.month], from: startDate, to: endDate).month!

если мы проверим в соответствии с вышеуказанной датой, она вернет 0 из-за неполных 30 дней.

Теперь я хочу получить результат с месячной разницей, если мы проверим вышеуказанную дату он должен вернуть 1, потому что месяц меняется. так есть ли способ проверить разницу дат, включая этот месяц?

Ответы [ 3 ]

3 голосов
/ 03 марта 2020

Как вы правильно определили, dateComponents(_:from:to:) не считает дробные месяцы.

Однако есть другая перегрузка , которая вычисляет разницу между DateComponents вместо Date с. Мы можем убрать все, что нам не нужно (день, час, минута и т. Д. c) с начала и до конца Date с, передать их в эту перегрузку, и это должно сделать для нас расчет. Это аналогично округлению чисел с плавающей запятой перед их вычитанием, так что вы можете получить разницу между их целочисленными частями.

let startDateComponents = Calendar.current.dateComponents([.year, .month], from: startDate)
let endDateComponents = Calendar.current.dateComponents([.year, .month], from: endDate)
let diffInDate = Calendar.current.dateComponents([.month], from: startDateComponents, to: endDateComponents).month!

Обратите внимание, что мы также получаем компонент year дат начала и окончания потому что год нужен и в расчете. Но когда мы вычисляем разницу, нам нужно только month.

1 голос
/ 03 марта 2020

Получите компонент month из startDate и endDate, а затем рассчитайте разницу между ними, т.е.

let startMonth = Calendar.current.component(.month, from: startDate)
let endMonth = Calendar.current.component(.month, from: endDate)
let difference = abs(endMonth - startMonth) //1
0 голосов
/ 03 марта 2020

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

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

import UIKit

func makeDate(year: Int, month: Int, day: Int) -> Date {
    let calendar = Calendar(identifier: .gregorian)
    let components = DateComponents(year: year, month: month, day: day) //, hour: hr, minute: min, second: sec)
    return calendar.date(from: components)!
}

let date1 = makeDate(year: 2016, month: 10, day: 23) // 23 OCT 2016
let date2 = makeDate(year: 2020, month: 7, day: 10) // 10 JULY 2020

func printMonths(date1: Date, date2: Date) {

    guard date1 < date2 else {return}

    let month1 = Calendar.current.component(.month, from: date1)
    let month2 = Calendar.current.component(.month, from: date2)
    let year1 = Calendar.current.component(.year, from: date1)
    let year2 = Calendar.current.component(.year, from: date2)

    if year1 == year2 {
        for month in month1...month2 {
            print(DateFormatter().monthSymbols[month - 1])
        }
    } else {
        for year in year1...year2 {
            print(year)
            switch year {
            case year1:
                for month in month1...12 {
                    print("   \(DateFormatter().monthSymbols[month - 1])")
                }
            case year2:
                for month in 1...month2 {
                    print("   \(DateFormatter().monthSymbols[month - 1])")
                }
            default:
                for month in 1...12 {
                    print("   \(DateFormatter().monthSymbols[month - 1])")
                }
            }
            print()
        }
    }
}

printMonths(date1: date1, date2: date2)

Эта функция будет печатать названия месяцев в порядке от даты1 до даты2, печатая годы для месяцев, если 2 даты имеют разные годы.

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

Вывод из примеров дат:

2016
   October
   November
   December

2017
   January
   February
   March
   April
   May
   June
   July
   August
   September
   October
   November
   December

2018
   January
   February
   March
   April
   May
   June
   July
   August
   September
   October
   November
   December

2019
   January
   February
   March
   April
   May
   June
   July
   August
   September
   October
   November
   December

2020
   January
   February
   March
   April
   May
   June
   July
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...