任何人都可以帮我解决小问题吗?我正在尝试获取给定年份的第一个月。
func createEmptyYearChartData(year: Date, month: Int = 1, chartEntries: [ChartModel]) -> [ChartModel] {
var chartData = chartEntries
let calendar = Calendar.current
let currentYear = calendar.component(.year, from: year)
let currentMonth = month
var components = DateComponents()
components.year = currentYear
components.month = month
let date = calendar.date(from: components)
guard let date = calendar.date(from: components) else { return [] }
if month >= 12 {
components.month = 12
chartData.append(ChartModel(date: calendar.date(from: components)!, count: 0))
return chartData
} else {
if currentMonth == month{
chartData.append(ChartModel(date: date, count: 0))
chartData = createEmptyYearChartData(year: date, month: month + 1, chartEntries: chartData)
}
return chartData
}
}
这是我用来通过递归填充数据的函数,当函数触发时,我得到过去几年 12 月 31 日的第一个日期的结果。参数中传递的年份只是
Date()
对象。
根据澄清请求进行编辑。
func aggregateYearlyTransactions(from transactions: [ExpenseEntry], forYear date: Date) {
let calendar = Calendar.current
let objects = createEmptyYearChartData(year: date, chartEntries: [])
print(objects)
}
现在这是我的函数调用,我期望返回具有从一月到十二月的日期值的对象。 但现在的输出如下:
[
ExpenseX.ChartModel(id: 31BC8706-CF32-412E-AD17-156688EF5E30, date: 2023-12-31 22:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 5D7379A1-E509-4B75-AF2F-6F4206F36977, date: 2024-01-31 22:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 02571E50-5FFF-4C13-987F-D2F3C7A8849A, date: 2024-02-29 22:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 7FE5CBCD-65B3-4368-8EAB-27B0018D9DCF, date: 2024-03-31 21:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: B2F5D804-FBAB-460A-9FE1-C2037701F49A, date: 2024-04-30 21:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 6D9BE539-EA9A-427F-BCAB-AE600DFB1792, date: 2024-05-31 21:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 00F6F464-186C-4400-BD7E-38F1659F9124, date: 2024-06-30 21:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 93E623E2-8A11-4F2D-92FE-D2CE5F48B586, date: 2024-07-31 21:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 743A30A4-3CD3-42EC-8020-A91008F433AF, date: 2024-08-31 21:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 34D67AA6-D941-4C33-AB83-6A3D8AB052A6, date: 2024-09-30 21:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 6721E21C-BFD2-469D-8DD9-E7004C9E0373, date: 2024-10-31 22:00:00 +0000, count: 0.0, animate: false),
ExpenseX.ChartModel(id: 32E7DC9F-BB03-44F3-A32F-54F600BE6ED4, date: 2024-11-30 22:00:00 +0000, count: 0.0, animate: false)
]
注意第一个打印的对象,它是 2023 年 12 月 31 日,最后日期是 11 月而不是 12 月。
编辑2: 我已经更新了该函数,添加了从组件获取后的 1 天至今。
func createEmptyYearChartData(year: Date, month: Int = 1, chartEntries: [ChartModel]) -> [ChartModel] {
var chartData = chartEntries
let calendar = Calendar.current
let currentYear = calendar.component(.year, from: year)
var components = DateComponents()
components.year = currentYear
components.month = month
let date = calendar.date(from: components)
guard let startDate = calendar.date(byAdding: .day, value: 1, to: date!) else { return [] }
if month >= 12 {
chartData.append(ChartModel(date: startDate, count: 0))
return chartData
} else {
chartData.append(ChartModel(date: startDate, count: 0))
return createEmptyYearChartData(year: year, month: month + 1, chartEntries: chartData)
}
}
通过每年添加一天以获得正确的日期,这对于长期有效吗?
其实,这也是意料之中的结果。您通过
Date()
来计算从今年第一天到今年最后一个月第一天的范围。即 2024 年 1 月 1 日 - 2024 年 1 月 12 日(月/日/年)。
Date()
打印出来时本身就是UTC日期时间,这取决于你的当地时间:
print(Date())
//2024-05-07 07:56:11 +0000
//2024-05-07 14:56:11 at my time zone (GMT+7)
然后,您没有在
DateComponents
中设置小时/分钟/秒,并且 DateComponents 使用 24 小时格式。因此,它会将您当前的时区作为默认时间,我假设是 GMT+2。这就是为什么你看到了22:00:00 +0000
您可以尝试使用
DateFormatter.localizedString
打印出日期值:
for model in models {
let date = DateFormatter.localizedString(
from: model.date,
dateStyle: .long,
timeStyle: .long)
print(date)
}
1 January 2024 at 12:00:00 AM GMT+7
1 February 2024 at 12:00:00 AM GMT+7
1 March 2024 at 12:00:00 AM GMT+7
1 April 2024 at 12:00:00 AM GMT+7
1 May 2024 at 12:00:00 AM GMT+7
1 June 2024 at 12:00:00 AM GMT+7
1 July 2024 at 12:00:00 AM GMT+7
1 August 2024 at 12:00:00 AM GMT+7
1 September 2024 at 12:00:00 AM GMT+7
1 October 2024 at 12:00:00 AM GMT+7
1 November 2024 at 12:00:00 AM GMT+7
1 December 2024 at 12:00:00 AM GMT+7