首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取swift中2个日期之间的月数合计

获取swift中2个日期之间的月数合计
EN

Stack Overflow用户
提问于 2020-03-03 13:43:37
回答 3查看 371关注 0票数 2

如何获得两个日期之间的合计月份?以下是获得约会的正常方式

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

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

代码语言:javascript
复制
let diffInDate:Int = Calendar.current.dateComponents([.month], from: startDate, to: endDate).month!

如果我们按照上面给定的日期检查,由于不是总共30天,它将返回0。

现在我想要一个月差的结果,如果我们检查上面的日期,它应该返回1,因为月份发生了变化。那么有没有办法检查包括那个月在内的日期差异呢?

EN

回答 3

Stack Overflow用户

发布于 2020-03-03 14:47:10

正如您已经正确识别的那样,dateComponents(_:from:to:)不会计算小数月份。

然而,有another overload,它计算DateComponents而不是Dates之间的差值。我们可以从开始和结束Date中去掉所有不需要的东西(天、小时、分钟等),将它们传递到这个重载中,它应该会为我们进行计算。这类似于在减去浮点数之前对它们进行舍入,这样您就可以得到它们的整数部分之间的差值。

代码语言:javascript
复制
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

票数 5
EN

Stack Overflow用户

发布于 2020-03-03 14:09:15

startDateendDate获取month组件,然后计算它们之间的差异,即

代码语言:javascript
复制
let startMonth = Calendar.current.component(.month, from: startDate)
let endMonth = Calendar.current.component(.month, from: endDate)
let difference = abs(endMonth - startMonth) //1
票数 0
EN

Stack Overflow用户

发布于 2020-03-03 15:24:21

我想指出的是,这个问题应该经过编辑,表明您希望知道如何列出月份,因为计算表示两个日期之间包含的月数的整数可能是完全不同的任务。对于这一点,sweeper的答案应该已经被认为足够了。

我将尝试提供一个解决方案来回应您的评论,其中您澄清您想要一个月份的列表。

代码语言:javascript
复制
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)

此函数将按从date1到date2的顺序打印月份名称,如果两个日期具有不同的年份,则打印月份的年份。

它可以很容易地修改为打印总月数,只需在每次打印月名时使用计数器,如果您也想这样做的话。

示例日期的输出:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60500764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档