【问题标题】:How to generate an ordered list of DateComponents.weekday values for the current locale如何为当前语言环境生成 DateComponents.weekday 值的有序列表
【发布时间】:2023-01-25 15:30:39
【问题描述】:

来自 DateComponents.weekday 的文档

工作日单位是从 1 到 n 的数字,其中 n 是一周中的天数。例如,在公历中,n 为 7,星期日用 1 表示。

来自Calendar.firstWeekday

firstWeekday 的默认值因日历和区域设置而异……对于公历和 ISO 8601 日历,1 是星期日。

鉴于此信息,我们如何获得当前语言环境的工作日数组,例如

在澳大利亚返回 [2, 3, 4, 5, 6, 7, 1],并且

在美国返回 [1, 2, 3, 4, 5, 6, 7]

【问题讨论】:

    标签: swift nscalendar nsdatecomponents


    【解决方案1】:

    在主题的另一个变体中,我将其设为 Calendar 扩展名。例如,改编 Willeke 的answer

    extension Calendar {
        /// Array of weekday values
        ///
        /// - Returns: An array of `Int` that represent the days of the week where 1 = Sunday and 7 = Saturday.
    
        func orderedWeekdays() -> [Int] {
            Array(firstWeekday...7) + Array(1..<firstWeekday)
        }
    }
    

    或者,您也可以获取工作日的范围,然后从中构建结果:

    extension Calendar {
        /// Array of weekday values
        ///
        /// - Returns: An array of `Int` that represent the days of the week where 1 = Sunday and 7 = Saturday.
    
        func orderedWeekdays() -> [Int] {
            guard
                let weekdays = range(of: .weekday, in: .weekOfYear, for: Date()),
                let index = weekdays.firstIndex(of: firstWeekday)
            else { return [] }
    
            return Array(weekdays[index...]) + Array(weekdays[..<index])
        }
    }
    

    【讨论】:

      【解决方案2】:

      干得好:

      extension DateComponents {
      
          /// Returns an array of Int that represent the days of the week in the given calendar's locale
          ///    e.g. returns [2, 3, 4, 5, 6, 7, 1] in Australia
          ///    e.g. returns [1, 2, 3, 4, 5, 6, 7] in USA
          static func orderedWeekdays(for calendar: Calendar) -> [Int] {
              let firstWeekday = calendar.firstWeekday
              return Array(firstWeekday...7) + Array(1..<firstWeekday)
          }
          
      }
      

      编辑:它应该是一个Calendar 扩展名。参见 Rob 的 Answer

      【讨论】:

        【解决方案3】:

        这就是我所做的,希望有更好的方法......

        extension DateComponents {
            /// Returns an array of Int that represent the days of the week in the given calendar's locale
            ///    e.g. returns [2, 3, 4, 5, 6, 7, 1] in Australia
            ///    e.g. returns [1, 2, 3, 4, 5, 6, 7] in USA
            static func orderedWeekdays(for calendar: Calendar) -> [Int] {
                let unorderedWeekdays: [Int] = Array(1...7)
                var orderedWeekdays: [Int] = []
                if var index = unorderedWeekdays.firstIndex(of: calendar.firstWeekday) {
                    while (orderedWeekdays.count < unorderedWeekdays.count) {
                        orderedWeekdays.append(unorderedWeekdays[index])
                        index += 1
                        if index >= unorderedWeekdays.count {
                            index = 0
                        }
                    }
                } else {
                    orderedWeekdays = unorderedWeekdays
                }
                return orderedWeekdays
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-08
          • 2018-08-09
          • 1970-01-01
          • 1970-01-01
          • 2020-05-01
          • 2010-12-06
          • 2015-07-11
          • 1970-01-01
          • 2017-04-11
          相关资源
          最近更新 更多