【问题标题】:How to find last day of current week in iPhone?如何在 iPhone 中找到本周的最后一天?
【发布时间】:2010-04-27 06:44:56
【问题描述】:

在我的应用程序中,我使用以下代码来检索当前日期和日期

NSDate *today1 = [NSDate date];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"dd/MM/yyyy :EEEE"];
    NSString *dateString11 = [dateFormat stringFromDate:today1];

    NSLog(@"date: %@", dateString11);
    //[dateFormat release];
    NSCalendar *gregorian11 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];  
    NSDateComponents *components1 = [gregorian11 components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:today1];
    [components1 setDay:([components1 day]-([components1 weekday]-1))];

    NSDate *beginningOfWeek1 = [gregorian11 dateFromComponents:components1];
    NSDateFormatter *dateFormat_first = [[NSDateFormatter alloc] init];
    [dateFormat_first setDateFormat:@"dd/MM/yyyy :EEEE"];
    NSString *dateString_first = [dateFormat_first stringFromDate:beginningOfWeek1];

    NSLog(@"First_date: %@", dateString_first);

但是使用上面的代码我只得到了当天和日期以及一周的第一天,但​​我需要得到一周的最后一天。

我的代码哪里错了,需要什么修改才能获得最后一天/星期几?

【问题讨论】:

    标签: iphone


    【解决方案1】:

    对我来说这是可行的:

    计算一周的第一天

    NSDate *today = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *weekdayComponents     = [gregorian components:NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:today];
    

    计算从今天减去的天数,以获得一周的第一天。在这种情况下,一周的第一天是星期一。这表示为首先用工作日整数减去 0,然后在 setDay 上加上 2。

    星期日 = 1、星期一 = 2、星期二 = 3、星期三 = 4、星期四 = 5、星期五 = 6 和星期六 = 7。通过向这些整数添加更多,您将进入下一周。

    NSDateComponents *componentsToSubtract  = [[NSDateComponents alloc] init];
    [componentsToSubtract setDay: (0 - [weekdayComponents weekday]) + 2];   
    [componentsToSubtract setHour: 0 - [weekdayComponents hour]];
    [componentsToSubtract setMinute: 0 - [weekdayComponents minute]];
    [componentsToSubtract setSecond: 0 - [weekdayComponents second]];
    

    为一周的第一天创建日期

    NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract toDate:today options:0];
    

    通过将第一天的日期加上 6,我们可以得到最后一天,在我们的示例中是星期日。

    NSDateComponents *componentsToAdd = [gregorian components:NSDayCalendarUnit fromDate:beginningOfWeek];
    [componentsToAdd setDay:6];
    NSDate *endOfWeek = [gregorian dateByAddingComponents:componentsToAdd toDate:beginningOfWeek options:0];
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      试试这个。

      [components1 setDay:([components1 day]-([components1 weekday]-1) + 6)];
      
      NSDate *endOfWeek1 = [gregorian11 dateFromComponents:components1];
      

      【讨论】:

      • [components1 setDay:([components1 day]-([components1 weekday]-1) + 6)];现在 =[gregorian dateFromComponents:components1]; [格式 setDateFormat:@"dd/MM/yyyy :EEEE"]; dateString = [格式 stringFromDate:now]; NSLog(@" 周 Last_date: %@", dateString);但上面的代码输出是== week Last_date: 29/04/2010 :Thursday
      • 这很奇怪。你得到一周的第一天——这是正确的,但是在你加上 6 天之后,你得到了第 4 天。好吧,我建议添加 9 而不是 6 - 这应该可以。
      • 作为所有阅读过 A.) 的人的一个概念。) 你把它绑定到一个日历上,B.) 你在硬编码数字而不保证大小和/或偏移量。 AKA,你永远不应该说 +6 并期望它会在本周末抵消。
      【解决方案3】:
      [components1 setDay:([components1 day]+([components1 weekday]+1))];
      

      它会打印出来

      日期:27/04/2010:星期二 周末:2010 年 1 月 5 日:星期六

      我写的是“周末”而不是第一天......

      【讨论】:

        【解决方案4】:
        NSDateComponents *components2 = [gregorian11 components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:today1];
        
            [components1 setDay:(([components2 day]-([components2 weekday]-7)))];
        
            NSDate *now =[gregorian11 dateFromComponents:components2]; 
            NSDateFormatter *format = [[NSDateFormatter alloc] init];
            [format setDateFormat:@"dd/MM/yyyy :EEEE"]; 
            NSString *dateString = [format stringFromDate:now]; 
            NSLog(@" week Last_date: %@", dateString);//here it gives me thursd
        

        【讨论】:

        【解决方案5】:

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

        此链接有一个关于如何获取日期的工作日的示例:

        http://stackoverflow.com/questions/1057349#1057405

        vikingosegundo 建议的另一种方法来获取开始和结束日期 rangeOfUnit:startDate:interval:forDate:。它为您提供某个时间单位的开始和间隔。有了它,可以很容易地在使用的日历中找到一周的开始,并添加 range-1 以获得该周最新的第二个。

        NSCalendar *cal = [NSCalendar currentCalendar];
        NSDate *now = [NSDate date];
        NSDate *startOfTheWeek;
        NSDate *endOfWeek;
        NSTimeInterval interval;
        [cal rangeOfUnit:NSWeekCalendarUnit 
               startDate:&startOfTheWeek 
                interval:&interval 
                 forDate:now];
        //startOfWeek holds now the first day of the week, according to locale (monday vs. sunday)
        
        endOfWeek = [startOfTheWeek dateByAddingTimeInterval:interval-1];
        // holds 23:59:59 of last day in week.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-03-08
          • 2011-06-14
          • 1970-01-01
          • 1970-01-01
          • 2023-01-28
          • 2011-01-06
          • 1970-01-01
          相关资源
          最近更新 更多