【问题标题】:Cocoa get first day in week可可得到一周的第一天
【发布时间】:2013-06-01 20:11:30
【问题描述】:

如何获取日期的一周的第一天

这似乎更容易,因为:

  • 当星期从星期日开始时,我需要取回星期日日期
  • 如果它从星期一开始,我需要得到星期一的日期

输入日期是一周中的任何日期...我尝试了几种方法,但边缘情况使其难以处理

我做了一个函数,但它不能 100% 工作(不确定 [components setDay: -weekday + 2];)

- (NSDate *)firstDateOfWeek {

    NSCalendar * calendar = [NSCalendar currentCalendar];

    NSDateComponents *weekdayComponents = [calendar components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:self];
    // because sunday is 0, we need it to be 6
    NSInteger weekday = (([weekdayComponents weekday] + 6) % 7);

    NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:self];
    [components setDay: -weekday + 2];

    return [calendar dateFromComponents:components];

}

【问题讨论】:

    标签: ios nsdate nscalendar


    【解决方案1】:

    使用rangeOfUnit 日历方法更容易,它可以根据当前语言环境正确处理“一周开始”:

    NSDate *date = your date;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *startOfWeek;
    [calendar rangeOfUnit:NSWeekOfYearCalendarUnit
                startDate:&startOfWeek
                 interval:NULL
                  forDate:date];
    

    使用NSDateComponents,它的工作方式如下(假设一周有7天):

    NSDate *date = your date;
    NSDateComponents *comp = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit
                                         fromDate:date];
    NSDate *startOfDay = [calendar dateFromComponents:comp];
    NSInteger diff = (NSInteger)[calendar firstWeekday] - (NSInteger)[comp weekday];
    if (diff > 0)
        diff -= 7;
    NSDateComponents *subtract = [[NSDateComponents alloc] init];
    [subtract setDay:diff];
    NSDate *startOfWeek = [calendar dateByAddingComponents:subtract toDate:startOfDay options:0];
    

    【讨论】:

    • 使用日期组件相当于什么?
    • NSWeekCalendarUnit 也已弃用:/
    • 但是 NSWeekOfYearCalendarUnit 在年初不会出问题吗?回馈 1.1。而不是一周中真正的第一天
    • @PeterLapisu:只是为了完整性(或者只是为了好玩 :-) 我添加了使用日期组件的等效代码。
    • @SilviuSt:罗马尼亚有夏令时,因此与格林威治标准时间的差是三个小时。在您的时区中,“2015-07-26 21:00:00 GMT”时间正是“2015-07-27 00:00:00”。要根据您的时区“查看”日期,请使用 NSDateFormatter 并将 NSDate 转换为字符串。
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2012-07-10
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2012-12-12
    • 2021-07-21
    相关资源
    最近更新 更多