Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift报表中的日期组件从年底日期算起_Swift_Date_Calendar - Fatal编程技术网

swift报表中的日期组件从年底日期算起

swift报表中的日期组件从年底日期算起,swift,date,calendar,Swift,Date,Calendar,我试图从它的结束日期得到下一年的年值。 现在我们有2021年,所以我需要2022年 到明年年底 let calendar=calendar.current 让今天=calendar.startOfDay(for:Date()) 让nextYear=calendar.date(通过添加:。年,值:1,到:今天) //可选(2022-02-03 15:17:22+0000) var endOfNextYear=calendar.dateInterval(of:.year,for:nextYear!)

我试图从它的结束日期得到下一年的年值。 现在我们有2021年,所以我需要2022年

到明年年底

let calendar=calendar.current
让今天=calendar.startOfDay(for:Date())
让nextYear=calendar.date(通过添加:。年,值:1,到:今天)
//可选(2022-02-03 15:17:22+0000)
var endOfNextYear=calendar.dateInterval(of:.year,for:nextYear!)。结束
//可选(2022-12-31 23:00:00+0000)
到目前为止,一切都很好,但现在,当我想使用
DateComponents
只获取年份值时,就会发生这种情况

print(calendar.dateComponents([.year],from:endOfNextYear!).year)
//可选(2023年)
为什么这一年会增加

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

endOfNextYear?.addTimeInterval(-1)
打印(calendar.dateComponents([.year],from:endOfNextYear!).year)
//可选(2022年)
这让我觉得这可能与zime时区有关,因为我在华沙比格林尼治标准时间高1个小时,但即使我尽可能明确地设置时区,这仍然是错误的一年

var calendar=calendar.current
calendar.timeZone=时区(缩写:“GMT”)!
let components=DateComponents(日历:日历,时区:时区(缩写:“GMT”),年份:2021年)
设d1=日历日期(从:组件)
设d2=calendar.date(通过添加:。年,值:1,到:d1!)
设d3=calendar.dateInterval(of:.year,for:d2!)。结束
打印(d3)
//可选(2023-01-01 00:00:00+0000)
我只想澄清一下,我知道我可以从以下几方面正确地选择这一年:

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


但我想知道,当我在
Date
上使用
end
属性时,为什么它会影响年份值,因为您的
endOfNextYear
计算已经产生了下一年的值。然后,
dateInterval
endOfNextYear
值上加上一年,使之成为2023年


基本上,
calendar.date(通过添加
&
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)
}
编辑: <>关于使用<代码>日期间隔(O::年,从:)/代码>将一年添加到您的日期中,请考虑以下代码:

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

然后输出

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

你想要的方式是2022-12-31 23:00:00+0000在你的时区不是午夜吗?意思是,已经是明年了吗?不是吗?日历。当前的日历是罪魁祸首。所以问题是,你真的想使用哪个日历?你的本地日历?没错!虽然默认情况下它被分配到了
日历。c当前
然后稍后当我使用
日历时。dateComponents
它不应该使用相同的日历吗?导致它保持23:00:00?您的答案很好,但它与我在问题底部的注释相同,如果我尝试使用下一年年底,它将转到2023年,而不是使用
nextYearDate
我将使用
日历。日期间隔(共:。年,用于:nextYearDate)?.end!
不要这样做。Alan解释说,这会使您的起始日期增加2年。只需在当前日期增加一年,然后从结果中获得年份分量。是的,我看到了,我正在试图理解为什么会发生这种情况,现在我发现更改这些操作的顺序会产生正确的年份,因此如果我st调用
dateInterval
然后
date(通过添加:
它给我2022(我会更新问题)好吧,它没有解决问题我犯了一个错误,但我仍然不明白为什么它会在明年添加,而我只想访问它的end。不确定调用
calendar.dateInterval后你的意思是什么(of:
我还有2022。当我调用
end
属性并对其进行操作时,它就会中断
year start =  1/1/21, 12:00 AM
year end =  12/31/21, 11:59 PM