设置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
相关产品推荐
相关产品推荐

