You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置DateComponents的year属性不生效该如何解决

DateComponents手动设置年份不生效解决方案

问题根因

调用Calendar.dateComponents(in:from:)获取日期组件时,返回的DateComponents实例会包含当前日期的全量关联属性,除了你手动修改的year、month、day之外,还保留了原始日期的yearForWeekOfYear、weekOfYear等周历相关的年属性。系统从DateComponents生成Date时,会优先匹配优先级更高的周历年属性,导致你手动设置的普通year属性被覆盖。

可行解决方案

方案1:清空冲突的周历属性

修改完目标日期属性后,手动将冲突的周历相关属性置为nil即可:

import Foundation
var components = Calendar.current.dateComponents(in: .current, from: Date())
components.day = 7
components.month = 3
components.year = 1900
// 清空周历相关冲突属性
components.yearForWeekOfYear = nil
components.weekOfYear = nil
components.weekday = nil

DateFormatter.localizedString(from: components.date!, dateStyle: .long, timeStyle: .long)

方案2(更推荐):初始化时仅拉取需要的组件

获取日期组件时,显式指定你需要用到的属性,从根源上避免引入多余的冲突属性:

import Foundation
// 仅指定需要用到的日期组件,不会拉取周历相关的多余属性
let originComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second, .timeZone], from: Date())
var modifiedComponents = originComponents
modifiedComponents.day = 7
modifiedComponents.month = 3
modifiedComponents.year = 1900

let targetDate = Calendar.current.date(from: modifiedComponents)!
DateFormatter.localizedString(from: targetDate, dateStyle: .long, timeStyle: .long)

内容的提问来源于stack exchange,提问作者Michael Hulet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:45:02