【问题标题】:Calculating first and last days of current week计算本周的第一天和最后一天
【发布时间】:2011-01-06 03:40:24
【问题描述】:

参考预先回答的问题:Getting first and last days of current week

上面的链接有两个答案。其中一个是理论上的,另一个是一种称为 PyObjC(Python-Objective C 桥接语言)的语言,快速谷歌搜索确认 PyObjC 不适用于 iPhone SDK。

所以关于这个问题,如何将 PyObjC 代码翻译成与 iPhone SDK 兼容。

目标:假设今天(星期二)是 19 日,星期日。是 17 日(一周开始)和星期六。 23 日是周末。我想得到一个像 19/01 - 23/01 [即一周的开始(hypen)一周的结束]

【问题讨论】:

标签: iphone objective-c date nsdate pyobjc


【解决方案1】:

如果您有一个NSDate,您可以使用当前的NSCalendar 来检索该日期的NSDateComponents。将NSDateComponents 的weekday 设置为1(一周的第一天),创建一个副本,并将副本的weekday 设置为7(一周的最后一天)。然后使用NSCalendar 将NSDateComponents 转换回各自的NSDate 对象,之后您可以使用NSDateFormatter 创建您的字符串表示。

此链接有一个关于如何获取日期工作日的示例:https://stackoverflow.com/questions/1057349#1057405

【讨论】:

  • 如果一周跨越一个月的月底和下个月的月初怎么办?
  • @jeffamaphone 由NSCalendar 从NSDateComponents 到NSDate 的转换将处理任何月份的翻转。如果您对此有疑问,请随时发布新问题,让我知道,我会回答。
  • 啊,好吧。我现在看到weekday 不是日期,而是星期几的序数。现在更有意义了。 :)
  • rangeofunit - 在此处查看答案(不接受的答案):stackoverflow.com/questions/11681815/…
【解决方案2】:

这里有一些代码,它还检查一个边缘情况,即一周的开始是在上个月开始的:

// Finds the date for the first day of the week
- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    // Edge case where beginning of week starts in the prior month
    NSDateComponents *edgeCase = [[NSDateComponents alloc] init];
    [edgeCase setMonth:2];
    [edgeCase setDay:1];
    [edgeCase setYear:2013];
    NSDate *edgeCaseDate = [calendar dateFromComponents:edgeCase];

    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:edgeCaseDate];
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
    [components setWeek:[components week]];

    NSLog(@"Edge case date is %@ and beginning of that week is %@", edgeCaseDate , [calendar dateFromComponents:components]);

    // Find Sunday for the given date
    components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
    [components setWeek:[components week]];

    NSLog(@"Original date is %@ and beginning of week is %@", givenDate , [calendar dateFromComponents:components]);

    return [calendar dateFromComponents:components];
}

编辑:上面的相关代码

- (NSDate *)firstDayOfWeekFrom:(NSDate *)givenDate {
  NSCalendar *calendar = [NSCalendar currentCalendar];

  NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
  [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
  [components setWeekOfYear:[components weekOfYear]];

  return [calendar dateFromComponents:components];
}

【讨论】:

    【解决方案3】:

    这是我几天前一直在寻找的东西,终于找到了。 NSDate 中有一个方法 rangeOfUnit:startDate:interval:forDate: 并以简单的方式执行此操作。您可以在以下位置查看详细信息: Current Week Start and End Date

    【讨论】:

      【解决方案4】:
      NSDate *weekDate = [NSDate date];
      NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
      
      NSDateComponents *currentComps = [myCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:weekDate];
      int ff = currentComps.weekOfYear;
      NSLog(@"1  %d", ff);
      
      [currentComps setWeekday:1]; // 1: sunday
      NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
      [currentComps setWeekday:7]; // 7: saturday
      NSDate *lastDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
      
      NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
      myDateFormatter.dateFormat = @"dd EEEE";
      NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek];
      NSString *secondStr = [myDateFormatter stringFromDate:lastDayOfTheWeek];
      
      NSLog(@"first - %@ \nlast - %@", firstStr, secondStr);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 2021-07-21
        • 2016-07-18
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        相关资源
        最近更新 更多