【问题标题】:NSDate / NSCalender count days in yearNSDate / NSCalender 计算一年中的天数
【发布时间】:2013-01-10 18:49:00
【问题描述】:

我正在制作一个应用程序,它可以根据某人在公司工作的年限来计算薪水。用户输入 2 个日期,第一个是他开始工作的日期(比如 2010 年 1 月 12 日),第二个是结束日期(比如 2012 年 1 月 2 日)。到目前为止,我知道他工作的总天数,但我想更具体以计算他的工作时间:

30 days in 2010 * 30$ per day = 90$
365 days in 2011 * 35$ per day = 12775$
32 days in 2012 * 40$ per day = 1280$

这是我第一次使用日期和日历,你可以猜到我对它们完全不熟悉。

【问题讨论】:

  • 如果您知道开始和结束日期...您还想知道什么?使用日期和日历组件并找到差异、日期等。
  • 开始/结束日期由用户给出,最多可能相差 30 年。请仔细阅读我想做什么。
  • 那么 3 年或 30 年有什么问题?
  • 我需要知道他每年工作了多少天。看我的例子。我不认为我可以让它变得更简单。你知道如何把我的例子翻译成实际的代码吗?
  • 在我上面的评论中......我把 you 推荐给了所有人,包括我。 ;(

标签: xcode nsdate nscalendar


【解决方案1】:

试试这个代码:

-(NSInteger)daysBetweenTwoDates:(NSDate *)fromDateTime andDate:(NSDate*)toDateTime{

    NSDate *fromDate;
    NSDate *toDate;

    NSCalendar *calendar = [NSCalendar currentCalendar];

    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&fromDate interval:NULL forDate:fromDateTime];
    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&toDate interval:NULL forDate:toDateTime];

    NSDateComponents *difference = [calendar components:NSDayCalendarUnit fromDate:fromDate toDate:toDate options:0];

    return [difference day]+1;//+1 as if start and end both date are same, so 1 day worked.
}

- (IBAction)calculate:(id)sender {
    NSDate *startDate=[self.startDate dateValue];//taking from datepicker
    NSDate *endDate=[self.endDate dateValue];//taking from datepicker

    NSTimeZone *gmt=[NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSDateFormatter *dateFormatterYYYY=[NSDateFormatter new];
    [dateFormatterYYYY setTimeZone:gmt];
    [dateFormatterYYYY setDateFormat:@"YYYY"];

    NSDateFormatter *dateFormatterDDMMYYYY=[NSDateFormatter new];
    [dateFormatterDDMMYYYY setDateFormat:@"dd/mm/YYYY"];
    [dateFormatterDDMMYYYY setTimeZone:gmt];


    //1. startDate to 31/12/StartDateYear
    //2. loop to endDateYear
    //3. 01/01/endDateYear to endDate

    /* step 1 */
    //find 31/12/StartDateYear
    NSLog(@"YYYY ; %@",[dateFormatterYYYY stringFromDate:startDate]);

    NSString *lastDateOfStartYearString=[NSString stringWithFormat:@"31/12/%@",[dateFormatterYYYY stringFromDate:startDate]];
    NSDateFormatter *dateFormatddMMyyyy=[NSDateFormatter new];
    [dateFormatddMMyyyy setDateFormat:@"dd'/'MM'/'yyyy"];
    NSDate *lastDateOfStartYear=[dateFormatddMMyyyy dateFromString:lastDateOfStartYearString];

    //no. of days
    NSInteger year=[[dateFormatterYYYY stringFromDate:startDate]integerValue];
    NSInteger days=[self daysBetweenTwoDates:startDate andDate:lastDateOfStartYear];

    //add in dictionary
    NSMutableDictionary *daysForYearDictionary=[NSMutableDictionary new];
    [daysForYearDictionary setValue:@(days) forKey:[NSString stringWithFormat:@"%ld",year]];



    /* step 2*/
    NSInteger nextYearAfterStart=[[dateFormatterYYYY stringFromDate:startDate]integerValue]+1;
    NSInteger previousYearBeforeEnd=[[dateFormatterYYYY stringFromDate:endDate]integerValue]-1;

    for (NSInteger yearCounter=nextYearAfterStart; yearCounter<=previousYearBeforeEnd; yearCounter++) {

        NSString *firstDateString=[NSString stringWithFormat:@"1/1/%ld",yearCounter];
        NSDate *firstDate=[dateFormatddMMyyyy dateFromString:firstDateString];

        NSString *lastDateString=[NSString stringWithFormat:@"31/12/%ld",yearCounter];
        NSDate *lastDate=[dateFormatddMMyyyy dateFromString:lastDateString];

        //no. of days
        days=[self daysBetweenTwoDates:firstDate andDate:lastDate];
        //add in dictionary
        [daysForYearDictionary setValue:@(days) forKey:[NSString stringWithFormat:@"%ld",yearCounter]];
    }



    /* step 3 */
    //find 1/1/EndDateYear
    NSString *firstDateOfStartYearString=[NSString stringWithFormat:@"1/1/%@",[dateFormatterYYYY stringFromDate:endDate]];
    NSDate *firstDateOfEndYear=[dateFormatddMMyyyy dateFromString:firstDateOfStartYearString];

    //no. of days
    year=[[dateFormatterYYYY stringFromDate:endDate]integerValue];
    days=[self daysBetweenTwoDates:firstDateOfEndYear andDate:endDate];
    //add in dictionary
    [daysForYearDictionary setValue:@(days) forKey:[NSString stringWithFormat:@"%ld",year]];




    //printing
    for (NSString *yearStr in daysForYearDictionary) {
        NSLog(@"Year : %@, Days Worked : %@",yearStr,[daysForYearDictionary valueForKey:yearStr]);
    }

}

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2015-04-27
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多