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

或者仅指定日期和时间组件,例如您真正需要的 calendartimeZone

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 中的所有值创建日期,则必须同时设置 yearyearForWeekOfYear @DuncanC 正如 Sweeper 指出的那样,您也可以将 yearForWeekOfYear 设置为 nil【参考方案2】:

请注意,您将获得所有日期组件,包括weekOfYearweekOfMonthdayOfWeek,最重要的是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 似乎没有纪念年份的主要内容,如果未能解决你的问题,请参考以下文章

开博纪念

mysql2_约束

在没有年份的 2 个日期之间搜索

从 String 创建 DateComponents / NSDateComponents,反之亦然

从 String 创建 DateComponents / NSDateComponents,反之亦然

用德鲁伊摄取 2 位数的年份?