【问题标题】:Current Week Start and End Date当前周开始和结束日期
【发布时间】:2012-07-25 18:41:04
【问题描述】:

我想获取当前周的开始和结束日期,并且我还想使用上一个 周开始和结束日期以及当月开始和结束日期的下周。

提前致谢。

【问题讨论】:

  • 展示你的努力,否则没有人有空闲时间做你的工作?

标签: ios objective-c cocoa-touch nsdate


【解决方案1】:
  • 只需 3 个步骤即可从任何地区获取每周的 Start dateEnd date
  1. 查找当天的星期几。
func getTodayWeekDay() -> String {
       let dateFormatter = DateFormatter()
       dateFormatter.dateFormat = "EEEE"
       let weekDay = dateFormatter.string(from: Date())
       return weekDay
}
  1. subtractionaddition 天制作 emun 课程。

即如果当前工作日是Wednesday,那么为了获得当前星期的Monday,我们必须从当天减去-2。 为了获得本周的Sunday,我们必须将4 添加到当天。

enum WeekDays: String {
    case monday = "Monday"
    case tuesday = "Tuesday"
    case wednesday = "Wednesday"
    case thursday = "Thursday"
    case friday = "Friday"
    case saturday = "Saturday"
    case sunday = "Sunday"
    
    var daysToSubstract: Int {
        switch self {
        case .monday: return 0
        case .tuesday: return -1
        case .wednesday: return -2
        case .thursday: return -3
        case .friday: return -4
        case .saturday: return -5
        case .sunday: return -6
        }
    }
    
    var daysToAdd: Int {
        switch self {
        case .monday: return 6
        case .tuesday: return 5
        case .wednesday: return 4
        case .thursday: return 3
        case .friday: return 2
        case .saturday: return 1
        case .sunday: return 0
        }
    }
}

  1. 从当天通过subtractionaddition 获取Start-weekEnd-week
extension Date {
    var startOfWeek: String? {
        let gregorian = Calendar(identifier: .gregorian)
        let startWeek = dateFormatter.string(from:gregorian.date(byAdding: .day, value: WeekDays(rawValue: getTodayWeekDay())?.daysToSubstract ?? 0, to: self)!)
        print("start-week--- \(startWeek)")
        return startWeek
    }

    var endOfWeek: String? {
        let gregorian = Calendar(identifier: .gregorian)
        let endWeek = dateFormatter.string(from:gregorian.date(byAdding: .day, value: WeekDays(rawValue: getTodayWeekDay())?.daysToAdd ?? 6, to: self)!)
        print("end-week--- \(endWeek)")
        return endWeek
    }
}
  • 您可以使用如下函数:
Date().startOfWeek
Date().endOfWeek

【讨论】:

    【解决方案2】:

    Swift 5.x 解决方案

    创建日期扩展:

    func weekPeriod() -> (startDate: Date, endDate: Date) {
        let calendar = Calendar(identifier: .gregorian)
        guard let sundayDate = calendar.date(from: calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return (startDate: Date(), endDate: Date()) }
        
        if calendar.isDateInToday(sundayDate) {
            let startDate = calendar.date(byAdding: .day, value: -6, to: sundayDate) ?? Date()
            let endDate = sundayDate
            return (startDate: startDate, endDate: endDate)
        }
        
        let startDate = calendar.date(byAdding: .day, value: 1, to: sundayDate) ?? Date()
        let endDate = calendar.date(byAdding: .day, value: 6, to: startDate) ?? Date()
        
        return (startDate: startDate, endDate: endDate)
    }
    

    【讨论】:

    • 谢谢!!它帮助很大。
    【解决方案3】:

    Swift 4.2

    如果你想显示当前的星期日期,这里是代码。

      override func viewDidLoad() {
            super.viewDidLoad()
    
            for dateIndex in 0..<7 {
                guard let startWeek = Date().startOfWeek else { return }
                let date = Calendar.current.date(byAdding: .day, value: dateIndex + 1, to: startWeek)
                print(date)
            }
    
    }
    
    
    
    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)
        }
    }
    
    

    【讨论】:

      【解决方案4】:

      Swift 3+:带有扩展的简单解决方案

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

      【讨论】:

        【解决方案5】:

        Swift 4 解决方案

        我已经根据我的要求想通了,我在哪里找到了关注的日期。

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

        所以,我创建了Date Extension 来获取当前周下周的日期。

        代码

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

        用法:

        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
        

        您可以根据需要修改Extension

        谢谢!

        【讨论】:

          【解决方案6】:

          这里是 swift4 的解决方案, 我们可以得到本周的所有天数。

          var calendar = Calendar(identifier: Calendar.Identifier.gregorian)
          let today = calendar.startOfDay(for: Date())    
          let dayOfWeek = calendar.component(.weekday, from: today) - calendar.firstWeekday
          let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: today)!
          let days = (weekdays.lowerBound ..< weekdays.upperBound)
                              .flatMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: today) }
          

          【讨论】:

          • 我无法弄清楚为什么要减去 1 来计算 dayOfWeek 变量。
          • 1 是一周的第一天 (calendar.firstWeekday)。您可以将 1 替换为 calendar.firstWeekday更新答案
          【解决方案7】:

          这里是 Swift 3 版本:-

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

          您可以像这样获取星期的开始日期和结束日期:

          let startWeek = Date().startOfWeek
          let endWeek = Date().endOfWeek
          
          print(startWeek ?? "not found start date")
          print(endWeek ?? "not found end date") 
          

          【讨论】:

          • 这假定星期一被设置为一周的开始。当前用户的 NSLocale 很容易不同意,因此这不是一个健壮的实现。另见yourcalendricalfallacyis.com
          【解决方案8】:
          //Begining of Week Date
          
          - (NSDate*) beginingOfWeekOfDate{
          
              NSCalendar *tmpCalendar = [NSCalendar currentCalendar];
              NSDateComponents *components = [tmpCalendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate:self];//get the required calendar units
          
              NSInteger weekday = tmpCalendar.firstWeekday;  
              components.weekday = weekday; //weekday
              components.hour = 0;
              components.minute = 0;
              components.second = 0;
          
              NSDate *fireDate = [tmpCalendar dateFromComponents:components];
          
              return fireDate;
          }
          
          //End of Week Date
          
          -(NSDate *)endOfWeekFromDate{
          
              NSCalendar *tmpCalendar = [NSCalendar currentCalendar];
              NSDateComponents *components = [tmpCalendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate:self];//get the required calendar units
          
              int weekday = 7; //Saturday
              if (tmpCalendar.firstWeekday != 1) {
                  weekday = 1;
              }
              components.weekday = weekday;//weekday
              components.hour = 23;
              components.minute = 59;
              components.second = 59;
          
              NSDate *fireDate = [tmpCalendar dateFromComponents:components];
          
              return fireDate;
          }
          

          【讨论】:

            【解决方案9】:

            先找到当前日期...

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

            计算从今天减去的天数,以获得一周的第一天。在这种情况下,一周的第一天是星期一。这表示为首先用工作日整数减去 0,然后在 setDay 上加上 2。

            星期日 = 1、星期一 = 2、星期二 = 3、星期三 = 4、星期四 = 5、星期五 = 6 和星期六 = 7。通过向这些整数添加更多,您将进入下周。

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

            为一周的第一天创建日期

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

            通过将第一天的日期加上 6,我们可以得到最后一天,在我们的示例中是星期日。

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

            下一个和上一个 ....

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

            【讨论】:

            • 嗨@Vikas S RajPut,感谢您的回答帮助我使用周模式日历,我按照您的回答并获得了本周的第一个和最后一个日期,正如您之前写的那样下周,我分别添加了 -7 和 +7 来获取日期,但我弄错了。你能帮帮我吗
            • 你好 Vikas,如果我一周中的任何一天通过这里,而不是仅当前日期,现在当我试图通过星期日,所以假设如果我们考虑本周,而不是通过这里星期五,我太阳经过这里,所以我应该得到星期一作为一周的开始,即 21,但我得到 28 作为一周的开始,这将是下周的星期一。你能帮我解决这个问题吗?
            【解决方案10】:

            在 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)!)
            

            【讨论】:

              【解决方案11】:

              斯威夫特 3

              先找到当前日期...

                  let today = Date()
                  let gregorian = Calendar(identifier: .gregorian)
                  var weekdayComponents: DateComponents? = gregorian.dateComponents([.weekday], from: today)
              

              星期日 = 1,星期一 = 2,星期二 = 3,星期三 = 4,星期四 = 5,星期五 = 6,星期六 = 7。

                  var componentsToSubtract = DateComponents()
                  componentsToSubtract.day = (0 - (weekdayComponents?.weekday!)!) + 2
              
                  beginningOfWeek = gregorian.date(byAdding: componentsToSubtract, to: today)
              
                  var componentsToAdd: DateComponents? = gregorian.dateComponents([.day], from: beginningOfWeek!)
                  componentsToAdd?.day = 6
                  endOfWeek = gregorian.date(byAdding: componentsToAdd!, to: beginningOfWeek!)
              
                  let components: DateComponents? = gregorian.dateComponents([.month], from: beginningOfWeek!)
                  let month: Int? = components?.month
              
                  let components1: DateComponents? = gregorian.dateComponents([.month], from: endOfWeek!)
                  let month1: Int? = components1?.month
              
                  print("\(month) - \(month1)")
              
                  showDate(start:beginningOfWeek!, end:endOfWeek!, strtMn:month!, endMn:month1!)
              
              func showDate(start:Date, end:Date, strtMn:Int, endMn:Int) {
                  if strtMn == endMn{
                      let formatter = DateFormatter()
                      formatter.dateFormat = "MMM dd"
                      let stringFromDate: String = formatter.string(from: start)
              
                      let formatter1 = DateFormatter()
                      formatter1.dateFormat = "dd"
                      let stringFromDate1: String = formatter1.string(from: end)
                      print("\(stringFromDate) - \(stringFromDate1)")
                      lblDate.text = "\(stringFromDate) - \(stringFromDate1)"
                  }
                  else{
                      let formatter = DateFormatter()
                      formatter.dateFormat = "MMM dd"
                      let stringFromDate: String = formatter.string(from: start)
              
                      let formatter1 = DateFormatter()
                      formatter1.dateFormat = "MMM dd"
                      let stringFromDate1: String = formatter1.string(from: end)
                      print("\(stringFromDate) - \(stringFromDate1)")
                      lblDate.text = "\(stringFromDate) - \(stringFromDate1)"
                  }
              }
              

              下一个和上一个 ....

              @IBAction func week_CalendarActionEvents(_ sender: UIButton) {
              
                  let gregorian = Calendar(identifier: .gregorian)
                  var offsetComponents = DateComponents()
                  var nextStrtDate: Date?
                  var nextEndDate: Date?
                  var startDate: Date?
                  var endDate: Date?
              
                  startDate = beginningOfWeek
                  endDate = endOfWeek
              
                  if sender.tag == 1 {
                      offsetComponents.day = -7
                  }
                  else if sender.tag == 2 {
                      offsetComponents.day = 7
                  }
              
                  nextStrtDate = gregorian.date(byAdding: offsetComponents, to:startDate!)
                  startDate = nextStrtDate
                  beginningOfWeek = startDate
              
                  nextEndDate = gregorian.date(byAdding: offsetComponents, to: endDate!)
                  endDate = nextEndDate
                  endOfWeek = endDate
              
                  let components: DateComponents? = gregorian.dateComponents([.month], from: startDate!)
                  let month: Int? = components?.month
              
                  let components1: DateComponents? = gregorian.dateComponents([.month], from: endDate!)
                  let month1: Int? = components1?.month
              
                  print("\(month)- \(month1)")
              
                  showDate(start:startDate!, end:endDate!, strtMn:month!, endMn:month1!)
              }
              

              【讨论】:

                【解决方案12】:

                这是 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)!
                    }
                }
                

                我们可以像这样使用这个扩展:

                print(Date().startOfWeek)
                print(Date().endOfWeek)
                

                【讨论】:

                • 如何计算 EndOfWeek?
                • @DarkTurtle 我很难弄清楚这是要达到什么目的。您介意详细说明这段代码的结果吗?
                • @MarksCode 这是使用扩展将两个自定义方法添加到原始Date 类。它还负责夏令时。
                • 它给出的 DATE 结果不正确 - 2017-05-25 00:43:17 +0000。 startDate 的 O/P 为 2017-05-20 23:00:00 +0000。设备时区 - 巴黎
                • 这段代码没有考虑闰秒 - 使用秒是日期数学被认为是危险的。
                【解决方案13】:

                Swift 版本

                vikingosegundoanswer

                let calendar = NSCalendar.currentCalendar()
                var startOfTheWeek: NSDate?
                var endOfWeek: NSDate!
                var interval = NSTimeInterval(0)
                
                calendar.rangeOfUnit(.WeekOfMonth, startDate: &startOfTheWeek, interval: &interval, forDate: NSDate())
                endOfWeek = startOfTheWeek!.dateByAddingTimeInterval(interval - 1)
                

                【讨论】:

                • 我很难弄清楚这是要达到什么目的。您介意详细说明这段代码的结果吗?
                • @MarksCode 它只是回答了 SO 问题 :) startOfTheWeekendOfWeek 是结果。
                【解决方案14】:

                rangeOfUnit:startDate:interval:forDate:。它为您提供某个时间单位的开始和间隔。有了它,可以很容易地在使用的日历中找到一周的开始,并添加 range-1 以获得该周最新的第二个。

                NSCalendar *cal = [NSCalendar currentCalendar];
                NSDate *now = [NSDate date];
                NSDate *startOfTheWeek;
                NSDate *endOfWeek;
                NSTimeInterval interval;
                [cal rangeOfUnit:NSWeekCalendarUnit 
                       startDate:&startOfTheWeek 
                        interval:&interval 
                         forDate:now];
                //startOfWeek holds now the first day of the week, according to locale (monday vs. sunday)
                
                endOfWeek = [startOfTheWeek dateByAddingTimeInterval:interval-1];
                // holds 23:59:59 of last day in week.
                

                【讨论】:

                • 获取 NSDates 开头和结尾的最有用方法。
                • 如果它有效,那就太棒了,但它会产生奇怪的结果; startOfTheWeek 是星期六/星期日而不是星期日/星期一和 23:00。 endOfWeek 正如预期的那样,但在 22:59:59...
                • 让我猜猜:您只是记录 nsdate 对象,但您并不碰巧生活在 GMT+0 时区。
                • NSWeekCalendarUnit 在 iOS 8.0 中已弃用,请使用 NSCalendarUnitWeekOfMonth 或 NSCalendarUnitWeekOfYear
                【解决方案15】:

                利用NSDate的方法rangeOfUnit:startDate:interval:forDate:,有一种更简单的方法可以实现:

                - (void)startDate:(NSDate **)start andEndDate:(NSDate **)end ofWeekOn:(NSDate *)date{
                    NSDate *startDate = nil;
                    NSTimeInterval duration = 0;
                    BOOL b = [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startDate interval:&duration forDate:date];
                    if(! b){
                        *start = nil;
                        *end = nil;
                        return;
                    }
                    NSDate *endDate = [startDate dateByAddingTimeInterval:duration-1];
                    *start = startDate;
                    *end = endDate;
                }
                
                NSDate *this_start = nil, *this_end = nil;
                [self startDate:&this_start andEndDate:&this_end ofWeekOn:[NSDate date]];
                

                所以现在您有了本周的开始日期和结束日期。然后上周:

                NSDate *lastWeekDate = [this_start dateByAddingTimeInterval:-10];
                NSDate *last_start = nil, *last_end = nil;
                [self startDate:&last_start andEndDate:&last_end ofWeekOn:lastWeekDate];
                

                下周:

                NSDate *nextWeekDate = [this_end dateByAddingTimeInterval:10];
                NSDate *next_start = nil, *next_end = nil;
                [self startDate:&next_start andEndDate:&next_end ofWeekOn:nextWeekDate];
                

                现在你都拥有了。

                【讨论】:

                • 时间间隔 10 的值是多少?
                • @nanjunda this_start是本周的开始,减去10秒,lastWeekDate上周的日期,所以last_start和@ 987654329@ 将是上周的开始和结束。当然你可以减去 1 或 100 秒,只要确保日期在上周就可以了。
                【解决方案16】:

                这里有一些代码,它还检查了一个边缘情况,即一周的开始时间从上个月开始。您可以通过将setWeekday 设置为7 来获得一周结束,您可以通过从[components week] 中减去1 来获得前一周

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

                【讨论】:

                  【解决方案17】:

                  问题已解决,感谢支持

                  代码:- 它给出了当前周的开始和结束日期。

                   NSDate *today = [NSDate date];
                   NSLog(@"Today date is %@",today);
                   dateFormat = [[NSDateFormatter alloc] init];
                   [dateFormat setDateFormat:@"yyyy-MM-dd"];// you can use your format.
                  
                   //Week Start Date 
                  
                   NSCalendar *gregorian = [[NSCalendar alloc]        initWithCalendarIdentifier:NSGregorianCalendar];
                  
                  NSDateComponents *components = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:today];
                  
                  int dayofweek = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:today] weekday];// this will give you current day of week
                  
                  [components setDay:([components day] - ((dayofweek) - 2))];// for beginning of the week.
                  
                  NSDate *beginningOfWeek = [gregorian dateFromComponents:components];
                  NSDateFormatter *dateFormat_first = [[NSDateFormatter alloc] init];
                  [dateFormat_first setDateFormat:@"yyyy-MM-dd"];
                  dateString2Prev = [dateFormat stringFromDate:beginningOfWeek];
                  
                  weekstartPrev = [[dateFormat_first dateFromString:dateString2Prev] retain];
                  
                  NSLog(@"%@",weekstartPrev);
                  
                  
                  //Week End Date
                  
                   NSCalendar *gregorianEnd = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
                  
                   NSDateComponents *componentsEnd = [gregorianEnd components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:today];
                  
                   int Enddayofweek = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:today] weekday];// this will give you current day of week
                  
                   [componentsEnd setDay:([componentsEnd day]+(7-Enddayofweek)+1)];// for end day of the week
                  
                   NSDate *EndOfWeek = [gregorianEnd dateFromComponents:componentsEnd];
                   NSDateFormatter *dateFormat_End = [[NSDateFormatter alloc] init];
                   [dateFormat_End setDateFormat:@"yyyy-MM-dd"];
                   dateEndPrev = [dateFormat stringFromDate:EndOfWeek];
                  
                   weekEndPrev = [[dateFormat_End dateFromString:dateEndPrev] retain];
                    NSLog(@"%@",weekEndPrev);
                  

                  【讨论】:

                    【解决方案18】:

                    您可以通过以下代码获取当前日期和日期:

                    NSDate *today = [NSDate date];
                        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease];
                        [dateFormat setDateFormat:@"EEEE"];
                        NSString *weekDay = [dateFormat stringFromDate:today];
                        [dateFormat setDateFormat:@"dd"];
                        NSString *thedate=[dateFormat stringFromDate:today];
                        //[dateFormat release];
                        NSLog(@"%@ %@", weekDay,thedate);
                    

                    现在,您需要在其中添加一些逻辑来计算一周的开始日期和结束日期。逻辑会这样,

                    如果工作日是星期一

                    然后

                    开始日期 = 当前日期 - 0

                    结束日期 = 当前日期 + 6

                    等等

                    我想你可以理解它。

                    【讨论】:

                      猜你喜欢
                      • 2012-07-23
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-30
                      • 2014-05-18
                      • 1970-01-01
                      • 2014-03-02
                      • 1970-01-01
                      相关资源
                      最近更新 更多