【问题标题】:Changing first day of the week in NSDateFormatter在 NSDateFormatter 中更改一周的第一天
【发布时间】:2010-09-02 10:20:52
【问题描述】:

为了得到我使用的星期几:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
NSArray *weekdays = [dateFormatter shortWeekdaySymbols];

Weekdays 给了我一个包含日期名称的数组,但它从星期日开始。由于某些原因,我希望这个数组在周一或周日开始,具体取决于设备的本地化设置。

有办法吗?

【问题讨论】:

    标签: iphone objective-c weekday


    【解决方案1】:

    您可以从具有当前语言环境的NSCalendar 对象的-firstWeekday 方法获取当前语言环境的第一个工作日的从1 开始的索引。然后您可以相应地修改您的周名称数组:

    // get week day names array
    NSArray *weekdays = self.shortWeekdaySymbols;
    
    // adjust array depending on which weekday should be first
    NSUInteger firstWeekdayIndex = [NSCalendar currentCalendar].firstWeekday - 1;
    if (firstWeekdayIndex) {
    
        NSRange firstRange = NSMakeRange(firstWeekdayIndex, weekdays.count - firstWeekdayIndex);
        NSRange lastRange = NSMakeRange(0, firstWeekdayIndex);
    
        NSArray *firstArray = [weekdays subarrayWithRange:firstRange];
        NSArray *lastArray  = [weekdays subarrayWithRange:lastRange];
    
        weekdays = [firstArray arrayByAddingObjectsFromArray:lastArray];
    }
    
    NSLog(@"%@", weekdays);
    

    我没有 iPhone SDK,但 AFAIK 这些 API 应该都在那里可用,并且行为方式与 OS X 上相同。

    【讨论】:

      【解决方案2】:

      使用以下方法在 Swift 中实现了类似于 hasseg 的结果:

          var symbols = dateFormatter.shortWeekdaySymbols as! [String]
          let firstDayIndex = calendar.firstWeekday - 1
      
          if firstDayIndex > 0 {
              var sub = symbols[0..<firstDayIndex]
              symbols.removeRange(Range<Int>(start:0, end:firstDayIndex))
              symbols += sub
          }
      

      【讨论】:

        【解决方案3】:

        您需要使用 NSCalender 以编程方式更改一周的开始日期。

        NSCalendar *_calendar;
        _calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        _calendar.timeZone = [NSTimeZone localTimeZone];
        [_calendar setFirstWeekday:2];// Sunday == 1, Saturday == 7
        _calendar.locale = [NSLocale currentLocale];
        
            NSDateComponents *dateComponent = [_calendar components:(NSCalendarUnitWeekOfYear | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:[NSDate date]];
            NSDate *now = [NSDate date];
            NSDateComponents *comp = [_calendar components:NSCalendarUnitYear fromDate:now];
            [comp setWeekOfMonth:dateComponent.weekOfYear];  //Week number.
            [comp setWeekday:2];
        
            NSDate * weekstartPrev = [_calendar dateFromComponents:comp];
        

        【讨论】:

          【解决方案4】:

          类似于 myexec 解决方案,但更通用且同样简洁

          let numDays = Calendar.current.weekdaySymbols.count
          let first = Calendar.current.firstWeekday
          let end = first + numDays - 1
          
          let days = (first...end).map {Calendar.current.weekdaySymbols[$0 % numDays]}
          

          【讨论】:

          • 你的意思可能是let first = Calendar.current.firstWeekday(不减1)吗?我认为否则你仍然会从星期日开始得到字符串,即使是星期一作为第一天的语言环境。
          • 你是对的。我已经更正了答案
          【解决方案5】:
          for i in 0...6 {
              let day = Calendar.current.weekdaySymbols[(i + Calendar.current.firstWeekday - 1) % 7]
              print(day)
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-26
            • 1970-01-01
            • 2020-12-25
            • 2015-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多