Swift:如果试图匹配年份组件,日历nextDate总是返回nil

cngwdvgl  于 2023-08-02  发布在  Swift
关注(0)|答案(1)|浏览(92)

我试图在Swift中找到一种强大的方法来获得当前年份的结束,并尝试了这个:

let yearComponent = Calendar.current.dateComponents([.year], from: Date.now)
return Calendar.current.nextDate(
    after: Date.now,
    matching: yearComponent,
    matchingPolicy: .nextTime,
    repeatedTimePolicy: .last,
    direction: .forward
)

字符串
令我惊讶的是,它总是返回nil。我想知道为什么。虽然,根据所需的精度,可能有更简单的解决方案,但我感兴趣的是为什么这个解决方案不起作用,以及是否有更好的/可行的解决方案返回当前年份的最后一个可能时刻。

6tdlim6h

6tdlim6h1#

我们不知道这个nextDate方法的确切实现是什么(除非它的代码在某处可用),但理论上在www.example.com之后有无限数量的日期Date.now,所以我猜它可能会以这样的方式实现,它总是增加给定的组件至少一次(并开始搜索从第一个可能的日期后,这一增加),只有在此之后,它检查是否找到适当的日期,这就是为什么它没有找到任何日期在您的情况下。
无论如何,你可以像下面的代码一样做一些事情来获取今年的最后一秒,所以也许这就足够满足你的需求了:

let yearComponent = Calendar.current.dateComponents([.year], from: Date.now)
let yearStart = Calendar.current.date(from: yearComponent)
let nextYearStart = yearStart.flatMap({ Calendar.current.date(byAdding: .year, value: 1, to: $0) })
let yearEnd = nextYearStart?.addingTimeInterval(-1)
print("yearEnd = \(yearEnd)")

字符串
我不知道你到底想达到什么目的,但是“最后可能的时刻”很难定义,因为理论上它可以有无限的精确度,所以你可能应该使用上面例子中的nextYearStart,并与其他日期进行比较。

相关问题