【问题标题】:Get NSDate from week and day从周和日获取 NSDate
【发布时间】:2014-04-07 21:28:49
【问题描述】:

我正在尝试从一天和一周的帖子到今天获得NSDate

例如week = 2 和 day = 4,这将是从现在开始的 two 周后的 thursday(假设一周从星期一开始)。

我使用NSCalendarNSDateComponents 尝试了很多不同的东西,但都没有成功。 也搜索了一下,但没有找到关于我的问题的任何其他主题。

我尝试的最后一件事是:

- (NSDate *)getDateForIndexPath:(NSIndexPath *)indexPath
{
    int week = ((indexPath.row / 7) % 5);
    int day = (indexPath.row % 7);

    NSDate *referenceDate = [NSDate date];

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"es_ES"]];
    [calendar setTimeZone:[NSTimeZone localTimeZone]];

    NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit | NSWeekCalendarUnit |NSWeekdayCalendarUnit) fromDate:referenceDate];
    [dateComponents setWeekday:day];
    [dateComponents setWeek:dateComponents.week+(week-1)];
    [dateComponents setWeek:dateComponents.week];

    NSDate *followingDate = [calendar dateFromComponents:dateComponents];

    NSLog(@"Week: %d - Day: %d", week, day);
    NSLog(@"followingDate: %@", followingDate);

    return followingDate;
}

这一遍又一遍地给了我相同的日期,除了它将第 0 天视为星期日的事实:

2014-04-08 00:02:33.706 TVSports[79878:60b] Week: 1 - Day: 0
2014-04-08 00:02:33.707 TVSports[79878:60b] followingDate: 2014-04-11 22:00:00 +0000
2014-04-08 00:02:33.708 TVSports[79878:60b] Week: 1 - Day: 1
2014-04-08 00:02:33.708 TVSports[79878:60b] followingDate: 2014-04-05 22:00:00 +0000
2014-04-08 00:02:33.709 TVSports[79878:60b] Week: 1 - Day: 2
2014-04-08 00:02:33.709 TVSports[79878:60b] followingDate: 2014-04-06 22:00:00 +0000
2014-04-08 00:02:33.710 TVSports[79878:60b] Week: 1 - Day: 3
2014-04-08 00:02:33.710 TVSports[79878:60b] followingDate: 2014-04-07 22:00:00 +0000

【问题讨论】:

  • NSDateComponents 是要走的路,向我们展示您对他们的尝试。
  • 我尝试了很多不同的东西。我可以试试看是否可以撤消上一次尝试的操作。
  • @Kevin 用我尝试过的最新代码更新了代码。现在似乎显示日期,但是日期不正确(除了时区问题)。

标签: objective-c nscalendar nsdatecomponents


【解决方案1】:

这个:

NSDate *referenceDate = [NSDate date];
...
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit | NSWeekCalendarUnit |NSWeekdayCalendarUnit) fromDate:referenceDate];

返回为今天正确填充的日期组件,因为您要求提供今天的日期,然后要求日历将其分解为年、月、周和工作日。

接下来,这个:

[dateComponents setWeekday:day];
[dateComponents setWeek:dateComponents.week+(week-1)];
[dateComponents setWeek:dateComponents.week];

设置日期。然后它读取当前设置的周并将week-1 添加到其中(因此第 1 周将是本周,第 2 周将是下周,等等)。然后它会再次重复读取星期并重新设置它。

您的输出表明代码可以正常工作。苹果是一家美国公司,所以工作日 0 对他们来说总是星期天。但他们知道,在大多数地方,星期日不是一周的第一天,所以您的代码要求输入“星期天(第 0 天),本周”——而不是“如果我们假装一周开始于星期日,则为“本周星期天” .它说星期天是 11 号。考虑到时区差异,这是正确的。

注意NSDates 没有时区NSDate 是特定时刻的不透明记录。那一刻你将如何交流并不重要。他们登录格林威治标准时间是为了能够说些什么。

然后您询问星期一、星期二和星期三,它会返回 5 日、6 日和 7 日。都正确。

旁注:只需使用:

NSCalendar *calendar = [NSCalendar currentCalendar];

使用当前系统日历。

【讨论】:

    【解决方案2】:

    您可以这样做以获得两周后的星期四:

    typedef NS_ENUM(NSUInteger, WeekDay){
        WeekDaySunday = 1,
        WeekDayModay,
        WeekDayTuesday,
        WeekDayWensday,
        WeekDayThursday,
        WeekDayFriday,
        WeekDaySaturday
    };
    
    
    NSDate *now = [NSDate date];
    NSDate *beginOfThisWeek;
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setFirstWeekday:WeekDayModay];
    [cal rangeOfUnit:NSWeekCalendarUnit // get the beginning of this week
           startDate:&beginOfThisWeek   // save the beginning to this variable
            interval:NULL               // we do not care for the weeks length
             forDate:now];
    NSDateComponents *twoWeeks = [[NSDateComponents alloc] init];
    twoWeeks.week = 2;
    twoWeeks.day = WeekDayThursday - WeekDaySunday -1 ; // we need the difference between thursday and the beginning of the week
    
    NSDate *thurdayInTwoWeeks = [cal dateByAddingComponents:twoWeeks 
                                                     toDate:beginOfThisWeek
                                                    options:0];
    

    【讨论】:

    • 我不得不做一些小的修改,但使用你的代码让它工作了。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多