SwiftUI 获取年份开始日期

问题描述 投票:0回答: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)
        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, 日期: 2023-12-31 22:00:00 +0000, 计数: 0.0, 动画: false), ExpenseX.ChartModel(id: 5D7379A1- E509-4B75-AF2F-6F4206F36977,日期:2024-01-31 22:00:00 +0000,计数:0.0,动画:false),ExpenseX.ChartModel(id:02571E50-5FFF-4C13-987F-D2F3C7A8849A,日期: 2024-02-29 22:00:00 +0000,计数:0.0,动画:false),ExpenseX.ChartModel(id:7FE5CBCD-65B3-4368-8EAB-27B0018D9DCF,日期:2024-03-31 21:00:00 +0000,计数:0.0,动画:假),ExpenseX.ChartModel(id:B2F5D804-FBAB-460A-9FE1-C2037701F49A,日期:2024-04-30 21:00:00 +0000,计数:0.0,动画:假), ExpenseX.ChartModel(id: 6D9BE539-EA9A-427F-BCAB-AE600DFB1792, 日期: 2024-05-31 21:00:00 +0000, 计数: 0.0, 动画: false), ExpenseX.ChartModel(id: 00F6F464- 186C-4400-BD7E-38F1659F9124,日期:2024-06-30 21:00:00 +0000,计数:0.0,动画:false),ExpenseX.ChartModel(id:93E623E2-8A11-4F2D-92FE-D2CE5F48B586,日期: 2024-07-31 21:00:00 +0000,计数:0.0,动画:false),ExpenseX.ChartModel(id:743A30A4-3CD3-42EC-8020-A91008F433AF,日期:2024-08-31 21:00:00 +0000,计数:0.0,动画:假),ExpenseX.ChartModel(id:34D67AA6-D941-4C33-AB83-6A3D8AB052A6,日期:2024-09-30 21:00:00 +0000,计数:0.0,动画:假), ExpenseX.ChartModel(id: 6721E21C-BFD2-469D-8DD9-E7004C9E0373, 日期: 2024-10-31 22:00:00 +0000, 计数: 0.0, 动画: false), ExpenseX.ChartModel(id: 32E7DC9F- BB03-44F3-A32F-54F600BE6ED4,日期:2024-11-30 22:00:00 +0000,计数:0.0,动画: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)
        }
    }

通过每年添加一天以获得正确的日期,这对于长期有效吗?

swift date swiftui
1个回答
0
投票

其实,这也是意料之中的结果。您通过

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
© www.soinside.com 2019 - 2024. All rights reserved.