gpt4 book ai didi

ios - 填充 tableview Swift 4 时,日期组件与预期不匹配

转载 作者:行者123 更新时间:2023-11-29 06:01:48 25 4
gpt4 key购买 nike

我很难理解为什么当我从附加日期 .day.weekday 读取时与预期的日期不匹配。在一个函数 dates() 中,我获取实际日期,获取该月的第一天,获取该月的天数范围,然后在循环中将该月的所有日期附加到 datesArray。在打印时,数组是正确的,从日期 1 开始,到日期 28(当月)结束。然后在 CalendarTableViewControllercellForRowAt 中,我将日期分配给该行。从日期开始获取组件。然后我将 cellLabel.textcomponents.day+ dayNamesArray[components.weekday] 组合在一起。结果是错误的:细胞从第 2 天(而不是 1 天)开始到第 1 天(而不是 28 天)结束一天关闭,因为日期名称错误。在哪里检查抵消结果的因素?像往常一样非常感谢。

这是两个函数:

func dates() {
datesArray.removeAll()

// Set calendar and date
let calendar = Calendar.current
let date = Date()

// Get range of days in month
let range = calendar.range(of: .day, in: .month, for: date)! // Range(1..<32)

// Get first day of month
var firstDayComponents = calendar.dateComponents([.year, .month, .day, .weekday], from: date)
self.displayedMonth = firstDayComponents.month!
self.monthCounter = self.displayedMonth - 1
firstDayComponents.day = range.lowerBound
let firstDay = calendar.date(from: firstDayComponents)!
var dayToAppend: Date = calendar.date(byAdding: DateComponents(day: 1), to: firstDay)!
for date in 1...range.count {

datesArray.append(dayToAppend)
dayToAppend = calendar.date(byAdding: DateComponents(day: 1), to: dayToAppend)!
}

self.actualMonthLabel.text = self.monthsArray[self.monthCounter]
print("dateArray is: \(datesArray)") // array is correct

}

在 TableView 中:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "calendarCell", for: indexPath) as!CalendarTableViewCell

// Configure the cell...

let date = datesArray[indexPath.row]
print(date)

let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day, .weekday], from: date)
print("month is: \(String(describing: components.month))") // correct
print("day is: \(String(describing: components.day))") // +1
print("weekdayIs: \(String(describing: components.weekday))") // +1
cell.dayLabel.text = "\(String(describing: components.day!))" + " " + "\(dayNamesArray[components.weekday! - 1])"
if indexPath.row == self.actualDay - 1 && self.actualMonth == self.displayedMonth {
cell.dayLabel.backgroundColor = UIColor.red.withAlphaComponent(0.3)
}

return cell
}

最佳答案

仔细查看代码中标记的行:

let firstDay = calendar.date(from: firstDayComponents)!
var dayToAppend: Date = calendar.date(byAdding: DateComponents(day: 1), to: firstDay)! // <<--!!!
for date in 1...range.count {
datesArray.append(dayToAppend) // <--!!!
dayToAppend = calendar.date(byAdding: DateComponents(day: 1), to: dayToAppend)!
}

您首先获得该月的firstDay。然后添加 1 天(因此 dayToAppend 是该月的第二天),然后将 dayToAppend 添加到数组中。所以你的数组从该月的第二天开始。 不是第一个。所以解决方案是:

let firstDay = calendar.date(from: firstDayComponents)!
var dayToAppend: Date = firstDay // <-- only line changed
for date in 1...range.count {
datesArray.append(dayToAppend)
dayToAppend = calendar.date(byAdding: DateComponents(day: 1), to: dayToAppend)!
}

您认为一切都很好的原因是:您可能没有考虑时区。例如,当我打印 2 月 1 日的日期对象时,它看起来像这样:2019-01-31 23:00:00 +0000。我住在 GMT+1。 Date 对象表示 23:00 GMT。这意味着现在是 24:00/00:00 GMT+1。这是第二天

始终仔细阅读打印的 Date 对象。 :)

关于ios - 填充 tableview Swift 4 时,日期组件与预期不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54593249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com