从不同的起始日开始一周

Posted

技术标签:

【中文标题】从不同的起始日开始一周【英文标题】:Get a Week From a Different Starting Day 【发布时间】:2014-08-06 04:28:16 【问题描述】:

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

任务是让用户选择日历中的任何一天。因此,假设他们在一个月前选择了星期二。 现在我想把整个星期放到一个数组中。所以之前的星期一,然后是星期二,然后是星期三,星期四,星期五,星期六,星期日。所以数组会一直保存 7 天。

事情是这样的——我想改变一下,这样用户就可以定义他们的“开始日”是什么——例如,如果我将星期四指定为开始日,那么如果我要再次选择一个随机的星期二从几个月前开始,数组应该是这样的:[Thurs/Fri/Sat/Sun/Mon/Tues/Wed](数组总是从用户的开始日期开始),如果你选择一个日期,它会倒退一周在您的开始日期之前。因此,例如,如果我选择 14 日星期二,那么它将回到 9 日星期四作为开始日。

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

有没有更好的方法来代替那样做?也许一些我不知道的漂亮 NSDateComponents 或类似的?

一如既往地感谢您的帮助!

【问题讨论】:

如果您选择开始日之后的一天 - 所以如果开始日是星期四并且您选择了星期五 - 您想要从所选日期前一天的星期四开始的那一周还是从 下一个星期四,即在所选日期之后? 【参考方案1】:

您可以设置当前日历的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

【讨论】:

我不知道单位的范围,我很高兴你让我知道这一点。将继续阅读有关 NSDate 的更多信息,但非常感谢:)

以上是关于从不同的起始日开始一周的主要内容,如果未能解决你的问题,请参考以下文章

使用当前日期生成一周的所有日期,还显示周一的周开始日期和周日的周末

netezza 中的周末日期

sql如何通过当前日期获取上周,上上周,上上上周的起始日期(周一_周七)

javascript 实现 传入周数,获取当前周的日期,周一到周天的年月日

从一个SQL打印全年日历漫谈数据仓库中时间操作场景的重点写法

SQL - 灵活地确定前一周的最后一天