1

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

4

4 回答 4

5

我的两分钱:

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);

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

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

于 2012-04-13T17:22:39.670 回答
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
 * )
 * 
 */
于 2012-04-13T17:36:46.937 回答
1

我假设这是一个一般性的编程问题,并不特定于 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;
}

希望这可以帮助。

于 2012-04-13T16:30:42.510 回答
0

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

如何检查一周中的哪一天(即周二、周五?)并比较两个 NSDate?

请参阅那里的Can Berk Güder的回答,它可能会帮助您了解如何获取星期几

您可以为此使用 NSDateComponents:

无符号单位 = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [gregorian components:units fromDate:date]; 然后您可以像这样访问日期的各个部分:

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

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

获取 NSDate 今天、昨天、本周、上周、本月、上个月……变量

参考Ben S的回答:

改编自日期和时间编程指南

// 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.

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

可能是写这篇文章的更好方法,但在这里我提出了 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);

希望这对您有所帮助。

于 2012-04-13T17:22:53.490 回答