【问题标题】:Get days of weeks into months将数周的天数转换为数月
【发布时间】:2021-05-16 20:14:00
【问题描述】:

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

我想在日期数字下显示星期的名称。

我使用 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
    }
}

内容视图

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
}

【问题讨论】:

    标签: date swiftui calendar


    【解决方案1】:

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

    • self.dateProvider.dateData.year 获取year
    • 在第一个循环中从index 获取month (ForEach(dateProvider.months.indices...)
    • 在第二个循环中从item 获取day (ForEach(1 ..&lt; dateProvider.getNumbersOfMonths...)

    然后,将此函数添加到您的 DateProvider 类中。这会组合 yearmonthday 中的日期,然后返回工作日缩写。

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

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多