Date 把几天变成几个月
例如,我想取1月的日数和对应于这一天的周名称。我怎么能得到这个 我想在天数下面显示一周的名称 我使用getNumbersOfMonths函数获取月份中的天数 需要注意的部分:2021年1月的第一天是星期五。二月的第一天是星期一。 日期提供程序Date 把几天变成几个月,date,swiftui,calendar,Date,Swiftui,Calendar,例如,我想取1月的日数和对应于这一天的周名称。我怎么能得到这个 我想在天数下面显示一周的名称 我使用getNumbersOfMonths函数获取月份中的天数 需要注意的部分:2021年1月的第一天是星期五。二月的第一天是星期一。 日期提供程序 class DateProvider: ObservableObject { @Published var months: [String] = [] @Published var dateData: DateType = Da
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)
}
}
}
}
}
}
}
要获取工作日缩写,如“Mon”,首先需要获取一个由
年
、月
和日
组成的日期
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))
}
}
- 从
self.dateProvider.dateData.year
- 从第一个循环(
ForEach(dateProvider.months.index…
)中的index
获取month
)
- 从第二个循环(
ForEach(1..
)中的item
获取day
)
然后,将此函数添加到日期提供程序
类中。这将组合年
、月
和日
的日期,然后返回工作日缩写
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))
}
}
ForEach(1..
结果: