Current Week Start and End Date

后端 未结 16 1350
轮回少年
轮回少年 2020-11-30 01:56

I want to get the current week start and end date and I also want to use the previous week start and end date and next week of the start and end date in current month.

相关标签:
16条回答
  • 2020-11-30 02:10

    Here's some code and it also checks an edge case where the beginning of the week starts in the prior month. You can get end of week by setting setWeekday to 7 and you can get the prior week by subtracting 1 from [components week]

    // Finds the date for the first day of the week
    - (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate
    {
        NSCalendar *calendar = [NSCalendar currentCalendar];
    
        // Edge case where beginning of week starts in the prior month
        NSDateComponents *edgeCase = [[NSDateComponents alloc] init];
        [edgeCase setMonth:2];
        [edgeCase setDay:1];
        [edgeCase setYear:2013];
        NSDate *edgeCaseDate = [calendar dateFromComponents:edgeCase];
    
        NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:edgeCaseDate];
        [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
        [components setWeek:[components week]];
    
        NSLog(@"Edge case date is %@ and beginning of that week is %@", edgeCaseDate , [calendar dateFromComponents:components]);
    
        // Find Sunday for the given date
        components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
        [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
        [components setWeek:[components week]];
    
        NSLog(@"Original date is %@ and beginning of week is %@", givenDate , [calendar dateFromComponents:components]);
    
        return [calendar dateFromComponents:components];
    }
    
    0 讨论(0)
  • 2020-11-30 02:12

    First find the current date...

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

    Calcuate number of days to substract from today, in order to get the first day of the week. In this case, the first day of the week is monday. This is represented by first subtracting 0 with the weekday integer followed by adding 2 to the setDay.

    Sunday = 1, Monday = 2, Tuesday = 3, Wednesday = 4, Thursday = 5, Friday = 6 and Saturday = 7. By adding more to this integers, you will go into the next week.

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

    Create date for first day in week

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

    By adding 6 to the date of the first day, we can get the last day, in our example Sunday.

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

    for next and previous ....

    -(IBAction)Week_CalendarActionEvents:(id)sender{
    
        NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
        NSDateComponents *offsetComponents = [[[NSDateComponents alloc] init] autorelease];
        NSDate *nextDate;
    
        if(sender==Week_prevBarBtn)  // Previous button events 
            [offsetComponents setDay:-7];
        else if(sender==Week_nextBarBtn) // next button events 
            [offsetComponents setDay:7];
    
        nextDate = [gregorian dateByAddingComponents:offsetComponents toDate:selectedDate options:0];
    
        selectedDate = nextDate;
        [selectedDate retain];
    
        NSDateComponents *components = [gregorian components:NSWeekCalendarUnit fromDate:selectedDate];
        NSInteger week = [components week];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"MMMM YYYY"];
        NSString *stringFromDate = [formatter stringFromDate:selectedDate];
        [formatter release];
        [Week_weekBarBtn setTitle:[NSString stringWithFormat:@"%@,Week %d",stringFromDate,week]];
    }
    
    0 讨论(0)
  • 2020-11-30 02:15

    Swift 3+: Simple solution with extension

    extension Date {
        var startOfWeek: Date? {
            let gregorian = Calendar(identifier: .gregorian)
            guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
            return gregorian.date(byAdding: .day, value: 1, to: sunday)
        }
    
        var endOfWeek: Date? {
            let gregorian = Calendar(identifier: .gregorian)
            guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
            return gregorian.date(byAdding: .day, value: 7, to: sunday)
        }
    
        var yesterdayDate: Date? {
            return NSCalendar.current.date(byAdding: .day, value: -1, to: noon)!
        }
    
        var tommorowDate: Date? {
            return NSCalendar.current.date(byAdding: .day, value: 1, to: noon)!
        }
    
        var previousDate: Date? {
            let oneDay:Double = 60 * 60 * 24
            return self.addingTimeInterval(-(Double(oneDay)))
        }
    
        var nextDate: Date? {
            let oneDay:Double = 60 * 60 * 24
            return self.addingTimeInterval(oneDay)
        }
    
        var noon: Date {
            return NSCalendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
        }
    
        var month: Int {
            return Calendar.current.component(.month,  from: self)
        }
    }
    
    0 讨论(0)
  • 2020-11-30 02:16

    Here's an elegant way for Swift 3 (Xcode 8+):

    extension Date {
        var startOfWeek: Date {
            let date = Calendar.current.date(from: Calendar.current.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
            let dslTimeOffset = NSTimeZone.local.daylightSavingTimeOffset(for: date)
            return date.addingTimeInterval(dslTimeOffset)
        }
    
        var endOfWeek: Date {
            return Calendar.current.date(byAdding: .second, value: 604799, to: self.startOfWeek)!
        }
    }
    

    And we can use this extension like this:

    print(Date().startOfWeek)
    print(Date().endOfWeek)
    
    0 讨论(0)
  • 2020-11-30 02:17

    In swift 3.0

    let cal = NSCalendar.current
    
    
    //weekday
    let weekday = cal.component(.weekday, from: Date())
    
    var dateComp = cal.dateComponents([.hour, .minute, .second, .day, .month, .year], from: Date())
    print(dateComp.day!)
    
    
    //Start Date of the week - Sunday
    dateComp.day = dateComp.day! - (weekday - 1)// start date of week
    
    print(cal.date(from: dateComp)!)
    
    
    //End Date of the Week - Saturday
    dateComp = cal.dateComponents([.hour, .minute, .second, .day, .month, .year], from: Date())
    
    
    dateComp.day = dateComp.day! + (7 - weekday)
    
    print(cal.date(from: dateComp)!)
    
    0 讨论(0)
  • 2020-11-30 02:19

    Swift 4 Solution

    I have figured out according to my requirement, where I have find out dates for following.

    1. Today
    
    2. Tomorrow 
    
    3. This Week 
    
    4. This Weekend 
    
    5. Next Week 
    
    6. Next Weekend
    

    So, I have created Date Extension to get Dates of Current Week and Next Week.

    CODE

    extension Date {
    
        func getWeekDates() -> (thisWeek:[Date],nextWeek:[Date]) {
            var tuple: (thisWeek:[Date],nextWeek:[Date])
            var arrThisWeek: [Date] = []
            for i in 0..<7 {
                arrThisWeek.append(Calendar.current.date(byAdding: .day, value: i, to: startOfWeek)!)
            }
            var arrNextWeek: [Date] = []
            for i in 1...7 {
                arrNextWeek.append(Calendar.current.date(byAdding: .day, value: i, to: arrThisWeek.last!)!)
            }
            tuple = (thisWeek: arrThisWeek,nextWeek: arrNextWeek)
            return tuple
        }
    
        var tomorrow: Date {
            return Calendar.current.date(byAdding: .day, value: 1, to: noon)!
        }
        var noon: Date {
            return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
        }
    
        var startOfWeek: Date {
            let gregorian = Calendar(identifier: .gregorian)
            let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))
            return gregorian.date(byAdding: .day, value: 1, to: sunday!)!
        }
    
        func toDate(format: String) -> String {
            let formatter = DateFormatter()
            formatter.dateFormat = format
            return formatter.string(from: self)
        }
    }
    

    USAGE:

    let arrWeekDates = Date().getWeekDates() // Get dates of Current and Next week.
    let dateFormat = "MMM dd" // Date format
    let thisMon = arrWeekDates.thisWeek.first!.toDate(format: dateFormat)
    let thisSat = arrWeekDates.thisWeek[arrWeekDates.thisWeek.count - 2].toDate(format: dateFormat)
    let thisSun = arrWeekDates.thisWeek[arrWeekDates.thisWeek.count - 1].toDate(format: dateFormat)
    
    let nextMon = arrWeekDates.nextWeek.first!.toDate(format: dateFormat)
    let nextSat = arrWeekDates.nextWeek[arrWeekDates.nextWeek.count - 2].toDate(format: dateFormat)
    let nextSun = arrWeekDates.nextWeek[arrWeekDates.nextWeek.count - 1].toDate(format: dateFormat)
    
    print("Today: \(Date().toDate(format: dateFormat))") // Sep 26
    print("Tomorrow: \(Date().tomorrow.toDate(format: dateFormat))") // Sep 27
    print("This Week: \(thisMon) - \(thisSun)") // Sep 24 - Sep 30
    print("This Weekend: \(thisSat) - \(thisSun)") // Sep 29 - Sep 30
    print("Next Week: \(nextMon) - \(nextSun)") // Oct 01 - Oct 07
    print("Next Weekend: \(nextSat) - \(nextSun)") // Oct 06 - Oct 07
    

    You can modify Extension according to your need.

    Thanks!

    0 讨论(0)
提交回复
热议问题