ios - 从不同的开始日开始一周

标签 ios swift ios8

在我尝试使用我的方法之前(我感觉这种方法过于简单且过于冗长),我想询问任何人 Swift 中是否有更简单/更直接的方法。

任务是让用户选择日历中的任意一天。假设他们在一个月前选择了星期二。 现在我想将整周放入一个数组中。所以之前的星期一,然后是星期二,然后是星期三、星期四、星期五、星期六、星期日。因此该数组将始终保存 7 天。

事情是这样的 - 我想对此进行更改,以便用户可以定义他们的“开始日”是什么 - 例如,如果我指定星期四作为开始日,那么如果我再次随机选择星期二从几个月前开始,数组应如下所示:[周四/周五/周六/周日/周一/周二/周三](数组始终以用户的开始日期开始),如果您选择日期,则会向后移动一周在您的开始日期之前。例如,如果我选择 14 号星期二,那么它将回到 9 号星期四作为开始日。

我的方法是简单地执行一个循环,从用户指定的日期开始,向后走直到到达开始日期,然后向前走直到到达相应的结束日期。

除了这样做之外,还有更好的方法吗?也许有一些我不知道的漂亮的 NSDateComponents 或类似的东西?

感谢您一如既往的帮助!

最佳答案

您可以设置当前日历的firstWeekday属性来确定 所有日历计算的一周第一天:

let cal = NSCalendar.currentCalendar()
cal.firstWeekday = 5 // 1 == Sunday, 5 == Thursday

使用rangeOfUnit来确定包含所选日期的一周的开始时间和日期:

let chosenDate = ...
var startOfWeek : NSDate? = nil
var lengthOfWeek : NSTimeInterval = 0
cal.rangeOfUnit(.WeekCalendarUnit, startDate: &startOfWeek, interval:&lengthOfWeek, forDate: chosenDate)
var endOfWeek = startOfWeek!.dateByAddingTimeInterval(lengthOfWeek)

迭代日期:

var date = startOfWeek!
let formatter = NSDateFormatter()
formatter.dateFormat = "EEEE, dd.MM.yyyy"

while date.compare(endOfWeek) == NSComparisonResult.OrderedAscending  {
    println(formatter.stringFromDate(date))
    date = cal.dateByAddingUnit(.DayCalendarUnit, value: 1, toDate: date, options: NSCalendarOptions(0))
}

示例输出(今天作为所选日期):

Thursday, 31.07.2014
Friday, 01.08.2014
Saturday, 02.08.2014
Sunday, 03.08.2014
Monday, 04.08.2014
Tuesday, 05.08.2014
Wednesday, 06.08.2014

关于ios - 从不同的开始日开始一周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25152239/

相关文章:

ios - 如何从 UIViewController 中删除外部 UIViews?

ios - CATransaction旋转层360度怪

objective-c - iOS 4 上运行的 NSJSONSerialization

ios - 如何从任意数组中的枚举获取原始值

ios - 在 Swift 中设置 UITextField 的最大字符长度

ios - 如何检查错误是否是 NSError 的子类

objective-c - 为什么应用程序没有在 iOS 8 中注册推送通知?

ios - 使用 Touch ID 将指纹存储在数据库中

iphone - IOS CS193p - 为什么 IBAction 连接被拖到 .m 文件而不是 .h?

ios - 如何知道ASIFormDataRequest完成了?