DateComponents 似乎没有纪念年份
Posted
技术标签:
【中文标题】DateComponents 似乎没有纪念年份【英文标题】:DateComponents doesn't seem to honor year 【发布时间】:2021-12-09 06:18:04 【问题描述】:我正在尝试将Date
转换为DateComponents
,更改一些属性,然后返回一个新的Date
。我写了以下代码:
import Foundation
var components = Calendar.current.dateComponents(in: .current, from: Date())
components.day = 7
components.month = 3
components.year = 1900
DateFormatter.localizedString(from: components.date!, dateStyle: .long, timeStyle: .long)
我已经在 ios 15.0 上的 iOS 模拟器上的 America/Denver
时区/区域设置以及运行最新 macOS Big Sur 和 Xcode 13.0 的 Mac 上的 Swift REPL 进行了测试,在这两个地方,我得到了在撰写本文时大约有以下输出:
March 7, 2021 at 9:38:13 AM MST
关于这一切的一切都符合预期,除了年份。我已将年份明确设置为1900
,但输出中的年份为2021
。如何在生成日期时让DateComponents
纪念年份,或者如何手动执行相同的操作以使其真正起作用?
【问题讨论】:
【参考方案1】:如果您从带有dateComponents(in:from:)
的日期获得所有 组件,您还必须相应地设置yearForWeekOfYear
components.yearForWeekOfYear = 1900
或者仅指定日期和时间组件,例如您真正需要的 calendar
和 timeZone
var components = Calendar.current.dateComponents([.calendar, .timeZone, .year, .month, .day, .hour, .minute, .second], from: Date())
components.day = 7
components.month = 3
components.year = 1900
DateFormatter.localizedString(from: components.date!, dateStyle: .long, timeStyle: .long)
【讨论】:
我的最终目标是拥有 2 个UIDatePickers
。一个设置日期和时间,另一个设置时间。我希望只设置时间的那个date
与第一个在同一日历日,它选择日期和时间。我一直在尝试手动保持同步,但我不确定是否有更好的方法来做到这一点。不过,这个答案似乎有效,所以我接受了。谢谢!
好收获(已投票)。我没有意识到,如果您尝试从 DateComponents 中的所有值创建日期,则必须同时设置 year
和 yearForWeekOfYear
。
@DuncanC 正如 Sweeper 指出的那样,您也可以将 yearForWeekOfYear
设置为 nil
。【参考方案2】:
请注意,您将获得所有日期组件,包括weekOfYear
、weekOfMonth
、dayOfWeek
,最重要的是yearForWeekOfYear
。当您将日期组件设置为 1900-03-07 时,您也没有正确设置所有这些组件,并且当从具有此类冲突组件的 DateComponents
解析 Date
时,算法恰好更喜欢年份他们来自yearForWeekOfYear
。
如果您将这些字段设置为nil
,您将获得预期的结果:
var components = Calendar.current.dateComponents(in: .current, from: Date())
components.day = 7
components.month = 3
components.year = 1900
components.yearForWeekOfYear = nil
虽然日期组件中仍然存在冲突,虽然这不会导致崩溃,但我不确定这种行为将来是否会改变。我建议您只获得您需要的组件。例如:
var components = Calendar.current.dateComponents([
.calendar, .timeZone, .era, .year, .month, .day, .hour, .minute, .second, .nanosecond
], from: Date())
【讨论】:
以上是关于DateComponents 似乎没有纪念年份的主要内容,如果未能解决你的问题,请参考以下文章
从 String 创建 DateComponents / NSDateComponents,反之亦然