下一年 swift returns 中的日期组件

date components in swift returns next year from end year date

我正在尝试从结束日期获取明年的年值。 例如,现在我们有 2021 年,所以我需要 2022 年。

到明年年底

let calendar = Calendar.current
let today = calendar.startOfDay(for: Date())

let nextYear = calendar.date(byAdding: .year, value: 1, to: today)
// Optional(2022-02-03 15:17:22 +0000)

var endOfNextYear = calendar.dateInterval(of: .year, for: nextYear!)?.end
// Optional(2022-12-31 23:00:00 +0000)

至此一切正常,但现在当我只想使用 DateComponents 获取年份值时,就会发生这种情况

print(calendar.dateComponents([.year], from: endOfNextYear!).year)
// Optional(2023)

为什么年会涨?

我的一个观察是,如果我减去 1 秒,那么年份就可以了

endOfNextYear?.addTimeInterval(-1)
print(calendar.dateComponents([.year], from: endOfNextYear!).year)
// Optional(2022)

这让我觉得这可能与 zime 区域有关,因为我在华沙比格林威治标准时间“早”1 小时,但即使我尽可能明确地设置时区,它仍然是错误的年份

var calendar = Calendar.current
calendar.timeZone = TimeZone(abbreviation: "GMT")!
let components = DateComponents(calendar: calendar, timeZone: TimeZone(abbreviation: "GMT"), year: 2021)
let d1 = calendar.date(from: components)
let d2 = calendar.date(byAdding: .year, value: 1, to: d1!)
let d3 = calendar.dateInterval(of: .year, for: d2!)?.end
print(d3)
// Optional(2023-01-01 00:00:00 +0000)

澄清一下,我知道我可以从以下位置正确获取年份:

print(calendar.dateComponents([.year], from: nextYear!).year)

但我想知道为什么当我在 Date

上使用 end 属性 时它会增加年份值

您的 endOfNextYear 计算已经产生了下一年的价值。 dateInterval 然后在 endOfNextYear 值上加上一年,使其成为 2023

基本上 calendar.date(byAddingcalendar.dateInterval(of: 本质上都是在添加一个间隔。

Alan 的回答解释了为什么您的代码给出了 两年 年后的值。

试试这个代码:

let calendar = Calendar.current
let today = calendar.startOfDay(for: Date())

let components = DateComponents(calendar: calendar, year: 1) //Create a DateComponents containing 1 year.

//Get a date in next year
if let nextYearDate = calendar.date(byAdding: components, to: today) {
    
    //Get the year value for next year.
    let nextYear = calendar.component(.year, from: nextYearDate)
    print(nextYear)
}

编辑:

至于为什么使用 dateInterval(of: .year, from:) 会为您的日期增加一年,请考虑以下代码:

if let thisYearInterval = calendar.dateInterval(of: .year, for: Date()) {
    let endOfYear = thisYearInterval.end
    let beginningOfYear = thisYearInterval.start
    print("year start = ", DateFormatter.localizedString(from: beginningOfYear, dateStyle:.short, timeStyle: .short))
    print("year end = ", DateFormatter.localizedString(from: endOfYear, dateStyle:.short, timeStyle: .short))
}

输出

year start =  1/1/21, 12:00 AM
year end =  1/1/22, 12:00 AM

它看起来像是在开始日期上增加了一整年,所以 .start 和 .end 日期实际上总是在不同的年份。

这看起来确实很奇怪。我会说它应该增加一年,减去一秒。

请注意,如果将 endOfNextYear 的计算从

更改为
let endOfYear = thisYearInterval.end

let endOfYear = thisYearInterval.end.addingTimeInterval(-0.01)

然后输出

year start =  1/1/21, 12:00 AM
year end =  12/31/21, 11:59 PM

你想要的方式