【问题标题】:How can i get last 7 days in an array from current date? [closed]如何从当前日期获取数组中的最后 7 天? [关闭]
【发布时间】:2012-04-13 16:24:15
【问题描述】:

我想要从系统当前日期开始的数组中的最后 7 天(例如 FRI、THU、WED、TUE、MON、SUN、SAT、FRI)。如果有人有任何想法,请提供帮助。我们将不胜感激。谢谢你非常喜欢。

【问题讨论】:

  • 在您的示例中有 8 天,而不是 7

标签: objective-c ios4


【解决方案1】:

我的两分钱:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"EEE"];

NSDate *now = [NSDate date];

NSMutableArray *results = [NSMutableArray arrayWithCapacity:8];

for (int i = 0; i < 8; i++)
{
    NSDate *date = [NSDate dateWithTimeInterval:-(i * (60 * 60 * 24)) sinceDate:now];
    [results addObject:[dateFormatter stringFromDate:date]];
}

NSLog(@"%@", results);

这样您可以获得本地化的工作日名称,而您不必自己构建它们的数组。

事实上,它给你的正是你所要求的。

【讨论】:

    【解决方案2】:

    哈哈,好吧,当我在处理其他一些事情时,你得到了一堆答案,但由于我已经完成了大部分工作,所以无论如何都在这里。这种方法甚至可以跨时间变化等工作,并提供本地化的日期名称。 (如果您像许多其他示例一样减去时间值,如果您接近时间变化,那么当时间变化时您会遇到问题......)

    // Subtract one day from the current date (this compensates for daylight savings time, etc, etc.)
    - (NSDate *)dateBySubtractingOneDayFromDate:(NSDate *)date {
        NSCalendar *cal = [NSCalendar currentCalendar];
    
        NSDateComponents *minusOneDay = [[NSDateComponents alloc] init];
        [minusOneDay setDay:-1];
        NSDate *newDate = [cal dateByAddingComponents:minusOneDay 
                                               toDate:date 
                                              options:NSWrapCalendarComponents];
        return newDate;
    }
    
    - (NSArray *)lastSevenDays {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"EEE"];
    
        NSDate *date = [NSDate date];
        NSMutableArray *weekDays = [[NSMutableArray alloc] initWithCapacity:8];
        for (int i = 0; i > -8; i--) {
            NSString *weekDay = [formatter stringFromDate:date];
            [weekDays addObject:weekDay];
            date = [self dateBySubtractingOneDayFromDate:date];
        }
        return weekDays;
    }
    
    
    // To use it, do this:
    NSLog(@"%@", [self lastSevenDays]);
    /* 
     * Results:
     * (
     *     Fri,
     *     Thu,
     *     Wed,
     *     Tue,
     *     Mon,
     *     Sun,
     *     Sat,
     *     Fri
     * )
     * 
     */
    

    【讨论】:

      【解决方案3】:

      我假设这是一个一般性的编程问题,并不特定于 iOS 环境。如果我的假设不正确,请随意忽略此答案。

      构建一个包含星期几的数组。 找到今天的索引, 在数组上向后循环,将内容复制到您正在创建的数组中,当您达到零时,将索引设置为 6(假设基于零的数组)并循环回一周中的今天。

      像这样(这段代码是假想的):

      string[] days = {"Mon", "Tues" .... "Sun"};
      string[] last8Days = new string[8];
      int daysIndex, last8DaysIndex;
      daysIndex = \\some code to get the index of today's day.
      for (last8DaysIndex = 0; last8DaysIndex < 8; last8DaysIndex++)
      {
         last8Days[last8DaysIndex] = days[daysIndex];
         daysIndex--;
         if(daysIndex < 0)
             daysIndex = 6;
      }
      

      希望这会有所帮助。

      【讨论】:

      • 假设如果我有今天的索引并且它是 6,那么应该如何实现循环请详细说明,或者如果你举个例子会更好。
      • 2 个问题:1. 您想要最后 7 天(如您所说)还是 8 天(如您的示例所示)? 2.您希望当天在第一位吗?
      • 是的,我说过 8 天。是的,我希望当天在第一位置。
      • 你是伟大的人。这和我需要的一样。再次非常感谢。约瑟夫万岁。
      • 很好的答案,但唯一的问题是它没有本地化......
      【解决方案4】:

      我认为这篇 StackOverflow 帖子最有用:

      How to check what day of the week it is (i.e. Tues, Fri?) and compare two NSDates?

      参考Can Berk Güder的回答,它可能会帮助你如何获得星期几

      您可以为此使用 NSDateComponents:

      无符号单位 = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSCalendar *gregorian = [[NSCalendar 分配] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate组件 *components = [gregorian components:units fromDate:date];那么您可以像这样访问日期的各个部分:

      [组件年份]; [组件月]; [组件日];或者,您可以 使用 NSCalendar 的 dateFromComponents 构造一个新的 NSDate 对象 方法,并比较两个 NSDate 对象。

      也请参阅下面的这篇文章,因为它可能会帮助您了解如何获取从当前日期开始的最后 7 天的逻辑

      get NSDate today, yesterday, this Week, last Week, this Month, last Month... variables

      参考Ben S的回答:

      改编自Date and Time Programming Guide

      // Right now, you can remove the seconds into the day if you want
      NSDate *today = [NSDate date];
      
      // All intervals taken from Google
      NSDate *yesterday = [today dateByAddingTimeInterval: -86400.0];
      NSDate *thisWeek  = [today dateByAddingTimeInterval: -604800.0];
      NSDate *lastWeek  = [today dateByAddingTimeInterval: -1209600.0];
      
      // To get the correct number of seconds in each month use NSCalendar
      NSDate *thisMonth = [today dateByAddingTimeInterval: -2629743.83];
      NSDate *lastMonth = [today dateByAddingTimeInterval: -5259487.66];
      

      如果您想根据月份获得正确的确切天数 你应该使用NSCalendar

      您还可以参考 hasnat 在同一篇文章中同样好的答案:

      可能是写这篇文章的更好方法,但这里是我想出的 Ben 的 NSCalendar 建议并从那里工作到 NSDateComponents

      NSCalendar *cal = [NSCalendar currentCalendar];
      NSDateComponents *components = [cal components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:[[NSDate alloc] init]];
      
      [components setHour:-[components hour]];
      [components setMinute:-[components minute]];
      [components setSecond:-[components second]];
      NSDate *today = [cal dateByAddingComponents:components toDate:[[NSDate alloc] init] options:0]; //This variable should now be pointing at a date object that is the start of today (midnight);
      
      [components setHour:-24];
      [components setMinute:0];
      [components setSecond:0];
      NSDate *yesterday = [cal dateByAddingComponents:components toDate: today options:0];
      
      components = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[[NSDate alloc] init]];
      
      [components setDay:([components day] - ([components weekday] - 1))]; 
      NSDate *thisWeek  = [cal dateFromComponents:components];
      
      [components setDay:([components day] - 7)];
      NSDate *lastWeek  = [cal dateFromComponents:components];
      
      [components setDay:([components day] - ([components day] -1))]; 
      NSDate *thisMonth = [cal dateFromComponents:components];
      
      [components setMonth:([components month] - 1)]; 
      NSDate *lastMonth = [cal dateFromComponents:components];
      
      NSLog(@"today=%@",today);
      NSLog(@"yesterday=%@",yesterday);
      NSLog(@"thisWeek=%@",thisWeek);
      NSLog(@"lastWeek=%@",lastWeek);
      NSLog(@"thisMonth=%@",thisMonth);
      NSLog(@"lastMonth=%@",lastMonth);
      

      希望对你有所帮助。

      【讨论】:

      • 一般来说,一个人的答案是有其优点的。如果您的答案未被接受,可能会被其他人点赞。
      • @trudyscousin:是的,那是真的.. :]
      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多