获取本周的第一天和最后一天

Posted

技术标签:

【中文标题】获取本周的第一天和最后一天【英文标题】:Getting first and last days of current week 【发布时间】:2009-10-26 14:20:19 【问题描述】:

如何?我需要的是某种方法来过滤一组具有 NSDate 属性的对象,只留下那些出现在本周的对象,然后按天过滤它们。我还需要一些方法来获取本地化的日期名称。

我尝试过使用 NSCalendar、NSDate 和 NSDateComponents,但我似乎不能只检查日历的第一个工作日,因为上个月/下个月的几天可能会有几周。

【问题讨论】:

【参考方案1】:

使用 NSDateComponents 获取工作日,即从 1 代表星期日到 7 点。

获得工作日编号后,计算它与一周的第一天之间的差值。例如,如果您认为星期一 (2) 是第一天,那么它提前了多少天(或者会提前多少天)。如果工作日是 4(星期三),则差值为 2。这意味着如果从原始日期减去两天,您将得到它所在一周的第一天。

检查documentation for details,因为您需要处理这些对象还包含时间属性的事实。如果可以,请确保当您只对日期和日期比较感兴趣时,时间值始终为零。

【讨论】:

如何从中获取 NSDate?更准确地说,除了工作日之外,我还必须填写 NSDateComponents 的哪些字段,才能让 NSCalendar 将其转换为一周的第一个 NSDate? 在我的回答中的文档链接中检查“日历、日期组件和日历单位”。这很明显。【参考方案2】:

好的,就这样,一个 python sn-p 完成这项工作

def daySec(diff):
    return 60*60*24*diff

def weekDays(dt=None):
    if not dt:
        dt = NSDate.date() # use today
    cal = NSCalendar.currentCalendar()
    dc = cal.components_fromDate_(NSWeekdayCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit, dt)
    normDt = cal.dateFromComponents_(dc) # get the day-rounded date
    shift = dc.weekday() - cal.firstWeekday()
    firstDt = normDt.dateByAddingTimeInterval_(daySec(-shift))
    lastDt = normDt.dateByAddingTimeInterval_(daySec(-shift+7)) # up to next week's first day midnight
    return (firstDt, lastDt)

【讨论】:

是的,它非常适合快速解决此类问题。使用 ipython 作为 shell,您可以快速获得结果,而无需一遍又一遍的 write-compile-run 循环。 NSDateComponents 方法将正确处理没有 60*60*24 秒的日子。

以上是关于获取本周的第一天和最后一天的主要内容,如果未能解决你的问题,请参考以下文章

js 获取当前月和当前周的第一天和最后一天

js如何获取上个月第一天和最后一天

如何使用js获取某月的第一天和最后一天

在objective-c中获取一周的第一天和最后一天

Extjs 4.1 datefield - 设置本周的第一天和最后一天

关于java中如何获取当前年份的第一天和最后一天