gpt4 book ai didi

ios - Swift - NSDate 和一年中的最后一周

转载 作者:搜寻专家 更新时间:2023-11-01 06:21:35 26 4
gpt4 key购买 nike

我正在制作一个 TimeTable 应用程序,我有一个方法可以将当前日期增加 1 周,这按预期工作,但是如果一周从 12 月过渡到 1 月,它会额外增加 1 天。

这是我的代码:

func getWeekDates(var date: NSDate) -> [NSDate] {
var dates: [NSDate] = [NSDate]()
for var i = 0; i < 5; i++ {
date = date.dateAtWeekStart() + 1.day - 1.week
date += i.day
dates.append(date)
}
return dates
}

dateAtWeekStart() :

func dateAtWeekStart() -> NSDate {
let flags : NSCalendarUnit = [NSCalendarUnit.Year,NSCalendarUnit.Month ,
NSCalendarUnit.WeekOfYear,
NSCalendarUnit.Weekday]
let components = NSCalendar.currentCalendar().components(flags, fromDate: self)
components.weekday = 1 // Sunday
components.hour = self.hour
components.minute = self.minute
components.second = self.second
return NSCalendar.currentCalendar().dateFromComponents(components)!
}

(dateAtWeekStart() 是 NSDate 扩展中的函数)

我添加 1 天并删除 1 周的原因是因为 dateAtWeekStart 下周日返回,例如 08-10-2015。 dateAtWeekStart()返回 11-10-2015。

所以这正常情况下工作正常,但是如果我们以今年为例,29-12-2015。 dateAtWeekStart()返回 04-01-2015 而不是 03-01-2016。

顺便说一下,设备上的区域设置为丹麦。

dateAtWeekStart,来自 malcommac 制作的名为 SwiftDate 的辅助类:https://github.com/malcommac/SwiftDate

更新编辑:我仍然无法弄清楚如何解决这个问题,我尝试将年份添加到组件中,如下所示:components.year = self.year , 但由于某种原因在返回组件时将年份设置为 2014..

最佳答案

dateAtWeekStart() 方法根本不起作用。[.YearForWeekOfYear, .WeekOfYear] 足以作为日历单位唯一确定一周的(开始)。额外的单位可以使计算未定。你也不能只设置components.weekday = 1 因为在某些地区星期一 (2) 是第一个星期几。

所以它实际上更容易一些:

extension NSDate {
func dateAtWeekStart() -> NSDate {
let cal = NSCalendar.currentCalendar()
// cal.firstWeekday = 1 // If you insist on Sunday being the first day of the week.
let flags : NSCalendarUnit = [.YearForWeekOfYear, .WeekOfYear]
let components = cal.components(flags, fromDate: self)
return cal.dateFromComponents(components)!
}
}

这应该适用于所有情况,并给出给定日期的一周开始时间(午夜)。还有其他方法可以使用,例如 rangeOfUnit()

如果你想让星期天被认为是一周的第一天而不是使用用户的区域设置那么您必须设置日历的 firstWeekday 属性。

向日期添加天数或周数的代码看起来也非常可疑。SwiftDate 项目中 Int 的扩展方法处理一天为 24*60*60 秒。这是不正确的,因为在具有夏令时,一天可以有 23 或 25 小时,当时钟被调整。将日期加一周的正确方法是再次使用日历组件:

date = cal.dateByAddingUnit(.WeekOfYear, value: 1, toDate: date, options: [])!

Swift 3 更新:

extension Date {
func dateAtWeekStart() -> Date {
var cal = Calendar.current
// cal.firstWeekday = 1 // If you insist on Sunday being the first day of the week.
let components = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
return cal.date(from: components)!
}
}

关于ios - Swift - NSDate 和一年中的最后一周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33008963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com