将数周变成数月

Get days of weeks into months

比如我想取一月的天数和这一天对应的周名。我怎样才能得到这个?

我想在天数下显示周的名称。

我使用 getNumbersOfMonths 函数获取月份中的天数。

需要注意的部分:2021年1月的第一天是星期五。二月的第一天是星期一。

日期提供商

class DateProvider: ObservableObject {
    
    @Published var months: [String] = []
    @Published var dateData: DateType = DateType(day: "", date: "", year: "", month: "")
    
    init() {
        months = getMonths()
        dateData = getCurrentDate()
    }
    
    func getCurrentDate() -> DateType {
        let date = Date()
        var currentDate = Calendar.current
        currentDate.locale = NSLocale(localeIdentifier: "tr_TR") as Locale
        let dateString = currentDate.component(.day, from: date)
        let monthNo = currentDate.component(.month, from: date)
        let month = currentDate.monthSymbols[monthNo - 1]
        let year = currentDate.component(.year, from: date)
        let weekNo = currentDate.component(.weekday, from: date)
        let day = currentDate.weekdaySymbols[weekNo - 1]
        return DateType(day: "\(day)", date: "\(dateString)", year: "\(year)", month: "\(month)")
    }
    
    func getMonths() -> [String] {
        let formatter = DateFormatter()
        formatter.locale = NSLocale(localeIdentifier: "tr_TR") as Locale
        let monthComponents = formatter.shortMonthSymbols ?? []
        return monthComponents
    }
    
    func getNumbersOfMonths(month: Int, year: Int) -> Int {
        let dateComponents = DateComponents(year: year, month: month)
        let calendar = Calendar.current
        let date = calendar.date(from: dateComponents)!
        let range = calendar.range(of: .day, in: .month, for: date)!
        let numDays = range.count
        return numDays + 1
    }
}

ContentView

struct ContentView: View {
    @State var data: DateType = DateType(day: "", date: "", year: "", month: "")
    @ObservedObject var dateProvider: DateProvider = DateProvider()
    var body: some View {
        ScrollView {
            VStack {

                VStack {
                    Text(self.dateProvider.dateData.day)
                    Text(self.dateProvider.dateData.date)
                    Text(self.dateProvider.dateData.month)
                    Text(self.dateProvider.dateData.year)
                    
                    VStack {
                        ForEach(dateProvider.months.indices, id: \.self) { index in
                            Text("\(dateProvider.months[index])")
                            LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 7), spacing: 10) {
                                ForEach(1 ..< dateProvider.getNumbersOfMonths(month: index + 1, year: 2021)) { item in
                                    Text("\(item)")
                                }
                            }
                            .padding(.vertical)
                        }
                    }
                }
                
            }
        }
    }
}

型号

struct DateType {
    var day: String
    var date: String
    var year: String
    var month: String
}

要获取工作日缩写,例如“Mon”,您需要先获取由 yearmonthday 组成的 Date

  • self.dateProvider.dateData.year
  • 得到year
  • 在第一个循环中从 index 得到 month (ForEach(dateProvider.months.indices...)
  • 在第二个循环中从item得到day(ForEach(1 ..< dateProvider.getNumbersOfMonths...)

然后,将此功能添加到您的 DateProvider class。这会从 yearmonthday 中组合一个日期,然后 returns 工作日缩写。

func getWeekday(year: Int, month: Int, day: Int) -> String {
    
    var components = DateComponents()
    components.year = year
    components.month = month
    components.day = day
    
    let formatter = DateFormatter()
    formatter.dateFormat = "E" /// see https://nsdateformatter.com/
    
    if let date = Calendar.current.date(from: components) {
        let string = formatter.string(from: date)
        return string
    }
    
    return "Mon"
}

最后,调用getWeekday函数,传入日期组件。

ForEach(1 ..< dateProvider.getNumbersOfMonths(month: index + 1, year: 2021)) { item in
    VStack {
        Text("\(item)")
        
        /// display weekday!
        Text("\(dateProvider.getWeekday(year: Int(dateProvider.dateData.year) ?? 2021, month: index, day: item))")
            .foregroundColor(.red)
            .font(.system(size: 12))
    }
}

结果: