下一年 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(byAdding
和 calendar.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
你想要的方式
我正在尝试从结束日期获取明年的年值。 例如,现在我们有 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(byAdding
和 calendar.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
你想要的方式